有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條操作,操作分為兩種 第一種是移動操作...