原題:
題意:
給出乙個邊陣列,每個位置為一條無向邊。開始時所有邊都連著。兩種操作:
翻轉乙個區間的邊(連改為斷,斷改為連)
問兩個點的點集(與之直接相連的點)是否相同
解析:
可以對邊分塊,區間修改時,中間一整段的打標記,兩邊的暴力。
為了方便區分點,對每個點隨機乙個hash值,點集為點的hash值異或。那麼就可以通過乙個數來判斷點集是否相同了。
用乙個陣列記錄每個段對每個點的貢獻,當打上標記後,這個貢獻就不能加上了。
暴力部分的貢獻用另外乙個陣列進行記錄。那麼查詢乙個點的邊集,相當於所有沒有標記的塊的貢獻異或上暴力的貢獻。
**:
#include
using
namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
const
int maxn=
2e5+5;
const
int maxm=
500;
int a[maxn]
,b[maxn]
;ll hash[maxn>>1]
;bool laz[maxm]
;// 標記
ll s[maxm]
[maxn>>1]
;// 塊內狀態
ll o[maxn>>1]
;//本身狀態
int l[maxm]
,r[maxm]
;int
main()
int ct=
0,b=
sqrt
(m);
for(
int i=
1;i<=m;i+
=b) laz[ct]=0
;}int q;
scanf
("%d"
,&q)
;while
(q--)}
printf
("%d"
,(sa==sb));
}else
rep(i,x,r[b1]
)rep
(i,l[b2]
,y)}
else}}
}puts(""
);}}
/*15 41 2
1 32 4
3 23
2 1 2
2 1 3
2 1 4
*/
區間分塊系列
很好的分塊知識講解。可能涉及的幾個詞語解釋 區間 數列中連續一段的元素 區間操作 將某個區間 a,b 的所有元素進行某種改動的操作 塊 我們將數列劃分成若干個不相交的區間,每個區間稱為乙個塊 整塊 在乙個區間操作時,完整包含於區間的塊 不完整的塊 在乙個區間操作時,只有部分包含於區間的塊,即區間左右...
區間處理之分塊
分塊這種思路很常見,就是把乙個數列劃分成k塊,然後在塊的基礎上進行操作。假如每塊的大小為magic,那麼長度為n的數列則一共會劃分成ceil n magic 塊。這樣會有一些性質 1.原數列第i個的塊號為i magic,是塊內的第i magic個 不過這一條沒有用 2.假如i magic 0,說明i...
分塊 區間眾數(金牌導航 分塊 1)
給出乙個數列,和若干詢問,每個詢問讓你求乙個區間內的眾數 6 3 1 2 3 2 1 2 1 5 3 6 1 51 2 11 n 4 1 04,1 m 5 104 1 a i 10 91 leqslant n leqslant 4 times 10 4,1 leqslant m leqslant 5...