Graph Games(邊分塊 區間邊翻轉)

2021-09-25 15:27:40 字數 1359 閱讀 1146

原題:

題意:

給出乙個邊陣列,每個位置為一條無向邊。開始時所有邊都連著。兩種操作:

翻轉乙個區間的邊(連改為斷,斷改為連)

問兩個點的點集(與之直接相連的點)是否相同

解析:

可以對邊分塊,區間修改時,中間一整段的打標記,兩邊的暴力。

為了方便區分點,對每個點隨機乙個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...