首先我們來分析一下題意。
題目會給出兩個大小為 \(n\) 的陣列,\(y\) 和 \(r\) ,其中 \(y_i\) 表示第 \(i\) 個年份是第幾年,\(r_i\) 表示的是第 \(y_i\) 年的降雨量。之後,將會有 \(m\) 次詢問,每次詢問給出兩個年份 \(y\) 和 \(x\) ,若用 z 表示 \(y\) 和 \(x\) 之間的年份,則我們要判斷的是三個年份的降雨量是否滿足 \(y\geqslant x>z\) ,根據判斷結果輸出不同的話。
很顯然,這是乙個 \(rmq\) 問題, \(rmq\) 問題有多種方式解決,下面將只給出 \(st\)表的解法。(其實我不會線段樹,單調棧也忘記怎麼寫了)
這道題看似是一道水題,其實它有非常多的坑點,因為題目中的 \(y,x,z\) 之間會有很多種大小關係,而對於每一種關係,我們都要判斷輸出的結果是 \(true\) ,\(false\) ,還是 \(maybe\) ,這就使得這道題會讓人變得非常頭疼。
對於 \(y,x,z\) 三者之間大小關係的分析,將直接在**中給出。
然而,我們並不是只需判斷 \(y,x,z\) 之間的關係,在某些情況下,我們還需判斷 \(y,x\) 之間所有年份的降水量是否已知。為了防止超時爆零,我們不能直接用 \(for\) 迴圈列舉判斷,但是我們可以利用二分法查詢中間年份,這樣就不會超時。
因為這題的資料範圍特別大, \(y_i\) 在 \(\pm 10^9\) 之間,我們不可能定義乙個大小有 \(2*10^9\) 的陣列來儲存每一年的降水量,所以我們需要對所給的年份進行離散化處理。但是,題目中所給出的年份本來就是從小到大排列的,這就幫我們省去了離散化的步驟(即給出的已經處於離散化狀態),我們只要直接按照所給順序做就行。
**如下:
#include#includeusing namespace std;
typedef long long ll;
const int n=50005;
int a[n],b[n],d[n][20],lg[n]= ;
int n,m;
int query(int x)
void rmq_init(int n)
for (int j=1; 1int k=lg[r-l+1];
return max(d[l][k],d[r-(1now=0;
}if (!now) goto m;
if (b[y]b[x]>rmq
if (x-y!=p-o) else puts("true"); //中間年份全部存在
}} else else
}} else else puts("maybe");//x,y都未知時。
}} m:;
} return 0;
}
祝各位大佬早日 \(akioi\) 。 洛谷 P2471 SCOI2007 降雨量
題目鏈結 在神貼題單裡看到了這道題,就拿出來做了。神貼鏈結 推薦看看這個洛穀神貼題單,真的很好笑 題目思路比較明顯對,年份離散化,年份也是單調遞增的。很明顯,我們 是需要維護年份區間最大的,可以利用線段樹或者st表維護,針對每一組 詢問,我們由已知條件來分類討論即可,分類討論比較複雜,需要注意細 節...
洛谷P2471 SCOI2007 降雨量
題鏈 該題洛谷題解區講的都很好 當詢問時,l r時,答案有可能不是true.奇怪的坑 include include include include include include pragma gcc optimize o2 using namespace std define ll long l...
題解 P2472 SCOI2007 蜥蜴
題目背景 07四川省選 題目描述 在乙個r行c列的網格地圖中有一些高度不同的石柱,一些石柱上站著一些蜥蜴,你的任務是讓盡量多的蜥蜴逃到邊界外。每行每列中相鄰石柱的距離為1,蜥蜴的跳躍距離是d,即蜥蜴可以跳到平面距離不超過d的任何乙個石柱上。石柱都不穩定,每次當蜥蜴跳躍時,所離開的石柱高度減1 如果仍...