poj 1733 帶權並查集 離散化

2021-09-08 09:38:04 字數 1125 閱讀 2215

思路:這題一看就想到要用並查集做了,不過一看資料這麼大,感覺有點棘手,其實,我們仔細一想可以發現,我們需要記錄的是出現過的節點到根節點的1個奇偶性,這與區間端點的大小並沒有關係,於是想到我們可以用map對映即可,這樣就解決了大資料了。此外,如果0表示出現偶數個1,1表示出現奇數個1,然後就是向量偏移關係了(

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 505089

intparent[maxn];

10int

kind[maxn];

11int

n,m,index;

1213

void

initiate()

1418 memset(kind,0,sizeof

(kind));19}

2021

int find(int

x)22

26int tmp=find(parent[x]);

27 kind[x]=(kind[x]+kind[parent[x]])%2;28

return parent[x]=tmp;29}

3031

bool union(int u,int v,int

d)32

38 parent[r1]=r2;

39 kind[r1]=(kind[v]-kind[u]+d+2)%2;40

return

true;41

}4243int

main()

4458

if(mp.find(b)==mp.end())

61if(!flag)continue;62

if(!union(mp[a],mp[b],d))66}

67if(flag)pos=m;

68 printf("

%d\n

",pos);69}

70return0;

71}7273

7475

7677

7879

view code

poj1733 離散化 帶權並查集的思考

題意是給你乙個區間和區間1的個數是偶數還是奇數 然後判斷第乙個錯提問的 第一眼看到這題感覺是線段樹 思考一下線段樹的做法 線段樹維護區間資訊 維護乙個區間是奇數還是偶數 線段樹乙個節點代表乙個區間 但是乙個區間並不代表乙個節點 要多個節點儲存乙個資訊 多個交叉區間維護的話 就亂掉了 而且一般線段樹題...

poj1733 帶權並查集 map

開始看題目姿勢不對,然後發現是n的長度是1000000000不是串的長度,又發現輸出是最多符合前幾項 這類區間並查集都維護乙個權值終於感覺理解了,左區間需要 1 由於陣列開不下,但詢問只有5000條就可以用map存,hash不會。還是re因為初始化的時候不是for i,1,n 是for i,1,50...

poj1733 種類並查集 離散化

題意 輸入n表示有乙個長度為n的0,1字串,m表示接下來有m行輸入,接下來的m行輸入中x,y,even表示第x到第y個字元中間1的個數為偶數個,x,y,odd表示第x到第y個字元中間1的個數為奇數個,若m句話中第k 1是第一次與前面的話矛盾,輸出k 思路 若x,y之間1的個數為偶數個,那麼1 x 與...