傳送門
lct維護子樹資訊。
加入一條路徑時給兩個端點x,y分別異或上rand出來的乙個權值,那麼若一條邊被所有路徑經過,即所有路徑的兩端點都分居這條邊的兩邊,那麼這條邊一端的子樹權值異或和為總的路徑的權值異或和。
跟上一道題一樣用lct維護子樹資訊即可。
1view code//achen
2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11
#define for(i,a,b) for(int i=(a);i<=(b);i++)
12#define rep(i,a,b) for(int i=(a);i>=(b);i--)
13const
int n=3e5+7
;14 typedef long
long
ll;15 typedef double
db;16
using
namespace
std;
17int n,m,ch[n][2],p[n],sum[n],flip[n],sz[n],s,op[n][3
],cq;
1819 templatevoid read(t &x)
2526
#define lc ch[x][0]
27#define rc ch[x][1]
28int isroot(int x)
2930
void update(int x) //
sum:總資訊 sz:虛兒子和自己的資訊
3132
void down(int
x)
3940
void rotate(int
x) 47
48void splay(int
x) 53
for(;!isroot(x);rotate(x)) 58}
5960
void access(int
x) 67}68
69void newroot(int
x) 74
75void cut(int x,int
y)
8283
void lik(int x,int
y) 91
92void change(int x,int
w) 98
99int
main()
109while(m--)
116else
if(o==2
) 121
else
if(o==3
) 126
else
if(o==4
) 133
}134
return0;
135 }
uoj 207 共價大爺遊長沙
miaom又來做lct了!lych 無敵 由於不是很懂lct子樹資訊維護的那套理論,想了好久 搞得樹剖的子樹維護就會了一樣!首先是乙個很巧妙的轉化 將邊在鏈上轉化為這條邊能將鏈的頂點分開。給每組頂賦乙個隨機權,每次可以把邊斷掉,查詢每個聯通塊內權值異或和是否等於所有頂點權值異或和,就是子樹異或和。然...
UOJ207 共價大爺遊長沙
uoj 神題 給每個點對隨機乙個權值,把這兩個點的權值異或上這個隨機的值 用l ctl ct 維護子樹資訊,若子樹異或和為所有點對的異或和那麼就是答案 大常數 include define rg register define il inline define fill a,b memset a,b...
UOJ207 共價大爺遊長沙
link 我們知道一條邊被所有路徑經過就是其乙個端點的子樹中包含了所有路徑的一端。那麼我們可以給每條路徑的端點rand乙個隨機權值,然後用lct維護子樹異或和,查詢就是看子樹異或和是否等於所有隨機權值的異或和。lct維護子樹資訊 單點修改就是多維護乙個虛子樹資訊,改變虛邊的時候修改一下就好了。這個方...