題目描述
第一行為兩個整數n,
q,以空格隔開。
接下來q
行,每行代表乙個事件。第
i+1行代表第
i個事件,這一行有三個整數ci
,xi,
yi,其中ci為
1或2。如果ci
為1,表示在城市xi
又新發現了yi
個病例;如果ci
為2,表示詢問從xi
到yi,病例最多的城市與病例第二多的城市的病例數之差為多少。
輸出描述
對於輸入中的每乙個
ci=2
的事件,輸出一行,即詢問的結果。
樣例輸入
42 1 4
1 2 3
2 2 4
1 3 2
2 1 3
1 2 2
2 1 4
樣例輸出03
13資料範圍及提示
【樣例說明】
初始時各個城市的病例數為。從
1到4最多的病例數為
0,第二多的病例數為
0,差值為
0,輸出0。
城市2發現了3
個新病例,病例數變為。從
2到4最多的病例數為
3,第二多的病例數為
0,差值為
3,輸出3。
城市3發現了2
個新病例,病例數變為。從
1到3最多的病例數為
3,第二多的病例數為
2,差值為
1,輸出1。
城市2發現了2
個新病例,病例數變為。從
1到4最多的病例數為
5,第二多的病例數為
2,差值為
3,輸出3。
【資料規模與約定】
對於40%
的資料,n,
q≤1000。對於
100%
的資料,2≤
n,q≤
100000
,且對於每乙個
ci=2
,滿足xi<
yi。題解:這道是線段樹求最大值的小變形。要求區間內的最大值和第二大值。我們在修改時記錄最大值和第二大值時即可,查詢時將所大區間內的最大值和第二大值記錄一下即可。
#include #include int n,q,x,y,z,xx,t=0,maxn=0,maxn1=0;
char ch;
bool bo;
struct treetree[400005];
using namespace std;
inline int read()
while ((ch<'0')||(ch>'9')) ch=getchar();
while ((ch>='0')&&(ch<='9'))
return f*x;
}inline void build(int root,int l,int r)
build(root*2,l,(l+r)/2);
build(root*2+1,(l+r)/2+1,r);
}inline void change(int root,int x)
if (x<=(ll+rr)/2) change(root*2,x); else change(root*2+1,x);
tree[root].maxx=max(tree[root<<1].maxx,tree[root<<1|1].maxx);
if (tree[root*2].maxx>tree[root*2+1].maxx)
tree[root].sec=max(tree[root*2+1].maxx,tree[root*2].sec);
if (tree[root*2].maxxmaxn1) maxn1=tree[root].maxx;
if (tree[root].maxx>maxn)
if (tree[root].sec>maxn1) maxn1=tree[root].sec;
if (tree[root].sec>maxn)
return;
} if (l<=(ll+rr)/2) find(root*2,l,r);
if (r>(ll+rr)/2) find(root*2+1,l,r);
}int main()
} return 0;
}
HAOI2018 反色遊戲
小c和小g經常在一起研究搏弈論問題,有一天他們想到了這樣乙個遊戲 有乙個 n nn 個點 m mm 條邊的無向圖,初始時每個節點有乙個顏色,要麼是黑色,要麼是白色 現在他們對於每條邊做出一次抉擇 要麼將這條邊連線的兩個節點都反色 黑變白,白變黑 要麼不作處理 他們想把所有節點都變為白色,他們想知道在...
題解 HAOI2018 反色遊戲
題目傳送門 給出乙個 n 個點 m 條無向邊的圖,每個點都有乙個 in 0,1 的權值,每次可以選擇一條邊,然後將該邊相連兩點權值異或上 1 問有多少種選擇方法使得每個點的權值都變為 0 每條邊只能選擇一次 但是這個問題太簡單了,所以你要求刪掉每個點以及它連出的邊之後的答案。有 t 組資料,t le...
BZOJ5330 SDOI2018 反回文串
luogu bzoj 列舉乙個長度為 n 為回文串,它的所有迴圈位移都可以產生貢獻。但是這樣算重了。重複的地方在於可能多個回文串迴圈同構,或者可能有的回文串經過小於 n 次迴圈位移後能夠得到自身。乙個比較好的處理方式是 對每個回文串求最小的 x 使這個串經過 x 次迴圈位移後可以再次成為乙個回文串。...