Noip2011 選擇客棧

2022-02-04 18:12:02 字數 2145 閱讀 5770

麗江河邊有 \(n\) 家很有特色的客棧,客棧按照其位置順序從 \(1\) 到 \(n\) 編號。每家客棧都按照某一種色調進行裝飾(總共 \(k\) 種,用整數 \(0\)~\(k-1\) 表示),且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。

兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過 \(p\) 。

他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過 \(p\) 元的咖啡店小聚。

第一行三個整數 \(n ,k ,p\),每兩個整數之間用乙個空格隔開,分別表示客棧的個數,色調的數目和能接受的最低消費的最高值;

接下來的 \(n\) 行,第 \(i+1\) 行兩個整數,之間用乙個空格隔開,分別表示 \(i\) 號客棧的裝飾色調和 \(i\) 號客棧的咖啡店的最低消費。

輸出只有一行,乙個整數,表示可選的住宿方案的總數。

對於 \(30\%\) 的資料,有 \(n\leq 100\);

對於 \(50\%\) 的資料,有 \(n\leq 1,000\);

對於 \(100\%\) 的資料,有 \(2 \leq n\leq 200,000\),\(0,\(0\leq p\leq 100\) , $0\leq $最低消費 \(\leq 100\)。

我竟然做了乙個小時我好菜啊

觀察到如果區間 \([l,r]\) 可行的話,那麼一定存在 $i\in [l,r] $ 使得 \(val[i]\leq p\)。

也就是說,對於這個區間的右端點 \(r\),如果知道了它左邊有乙個 \(i\) 滿足 \(val[i]\leq p\),那麼這個 \(i\) 左邊的點都可以對答案有貢獻。

稍微貪心的想,我們想找的這個 \(i\) 一定是離 \(r\) 最近的點,否則,一定可以找到離 \(r\) 更近且滿足要求的點,使得答案不會變差。

那麼問題就轉化為了對於每乙個點 \(p\),找出它左邊第乙個滿足 \(val[i]\leq p\) 的點 \(i\),然後所有與 \(p\) 顏色相同並且在 \(i\) 左邊的點都會與 \(p\) 對答案產生 \(1\) 的貢獻。

所以,我們只需要對每個顏色開乙個陣列 \(col[i][j]=k\) 表示所有顏色為 \(i\) 的點中從左向右第 \(j\) 個是點 \(k\)。

另外,每個點記錄它左邊且最接近它的乙個點 \(i\) 使得 \(val[i]\leq p\) 記為 \(last\) 陣列(注意這裡 \(last[i]\) 是可以等於 \(i\) 的)。

然後列舉每個點 \(i\),首先在 \(col[idx[i]]\) 中二分出相同顏色這個點前面有 \(b\) 個點,同時根據 \(last[i]\) 二分出相同顏色在 \(last[i]\) 前面有 \(c\) 個點。

注意,這時候要分情況討論了:

如果 \(i=last[i]\) ,也就是說無論左端點在哪,這兩個人都可以去右端點吃飯,所以直接 \(ans+=b\) 即可。

\(i!=last[i]\) 但是 \(idx[i]=idx[last[i]]\),也就是說,這個點前面滿足要求的最近的點跟它顏色一樣。注意到我們的 \(c\) 是 \(last[i]\)前面有 \(c\) 個點,如果顏色相同的話,應該算上 \(last[i]\) ,所以 \(ans+=c+1\)。

最後一種情況,即 \(i!=last[i]\;and\;idx[i]!=idx[last[i]]\) ,這種情況是最簡單的, \(ans+=c\) 就ok了。

時間複雜度 \(\mathcal\)。

#include#include#define n 200005

#define ll long long

#define min(a,b) ((a)<(b)?(a):(b))

ll ans;

int n,k,p;

int qzh[n];

int val[n];

int idx[n];

int last[n];

int col[55][n];

signed main()

for(int i=1;i<=n;i++)

printf("%lld\n",ans);

return 0;

}

NOIP 2011 選擇客棧

奇奇怪怪的題目。奇奇怪怪的演算法。題目描述 description輸入描述 input description 共n 1 行。第一行三個整數 n,k,p,每兩個整數之間用乙個空格隔開,分別表示客棧的個數,色調的數目和能接受的最低消費的最高值 接下來的 n 行,第i 1 行兩個整數,之間用乙個空格隔開...

NOIP2011選擇客棧

題目分析 這是一道比較好玩的題目,情景感比較強。而問題的實質就是 1 將同種顏色的客棧進行處理。2 對於乙個客棧,它有兩種情況,費用超過p 費用不超過p。3 超過p的找之後相同顏色且費用不超過p的。4 不超過p的與之後相同顏色的隨意組合。既然是批量處理,自然想到了字首和。處理3的時候用到了字尾和 想...

NOIp2011 選擇客棧

麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾 總共 k 種,用整數 0 k 1 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家...