hdu 3234 異或(加權並查集)

2022-04-09 03:46:44 字數 1273 閱讀 2076



有n(n<=20000)個未知的整數x0,x1,x2xn-1,有以下q個(q<=40000)操作:

i p v :告訴你xp=v

i p q v :告訴你xp xor xq=v

q k p1 p2 … pk : 詢問 xp1 xor xp2 .. xor xpk, k不大於15。

如果當前的i跟之前的有衝突的話,跳出

思路就是並查集的擴充套件,每個節點表示他與根結點的異或值 。。。。思路略

ps:忘打了個.導致wa了好長時間............跪了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define ll long long

const ll maxn = 20000 + 5;

const ll inf = 1000000000;

ll x[maxn];

ll pa[maxn], num[maxn], n;//num陣列記錄每個集合中的元素個數

void init()

}ll find(ll id)

else return id;

}bool unio(ll p, ll q, ll v)

if(pap == n) swap(pap, paq);

pa[pap] = paq;

x[pap] = x[p] ^ x[q] ^ v; // 最重要的一步,將兩顆樹連線在一起,很巧妙;

return true;

}int main()

scanf("%s", cmd);

if(cmd[0] == 'i')

if(!unio(p, q, v))

}else

for(ll i = 0; i < k; i++)

for(ll i = 0; i < k; i++)

}if(!tag) printf("i don't know.\n");

else printf("%lld\n", ans);

}} printf("\n");

} return 0;

}

hdu 3234 異或(加權並查集)

有n n 20000 個未知的整數x0,x1,x2xn 1,有以下q個 q 40000 操作 i p v 告訴你xp v i p q v 告訴你xp xor xq v q k p1 p2 pk 詢問 xp1 xor xp2 xor xpk,k不大於15。如果當前的i跟之前的有衝突的話,跳出 思路就是...

模版 並查集(及其加權)

並查集是經典的圖論演算法,用來維護點與集合的關係,也簡潔明瞭。給定 n nn 個點,有 m mm 次操作,每次操作輸入 pppa aab bb 若 p 1 p 1 p 1 則 合併 aaab bb 若 p 2 p 2 p 2 則 查詢 aaab bb 是否同屬乙個集合 並查集初始化 每個父親點 都 ...

疊積木(加權並查集)

題目描述 約翰和貝西在疊積木。共有30000塊積木,編號為1到30000。一開始,這些積木放在地上,自然地分成n堆。貝西接受約翰的指示,把一些積木疊在另一些積木的上面。一旦兩塊積木相疊,彼此就再也不會分開了,所以最後疊在一起的積木會越來越高。約翰讓貝西依次執行p條操作,操作分為兩種 第一種是移動操作...