uoj 207 共價大爺遊長沙

2022-05-02 05:03:08 字數 2030 閱讀 5271

題面:

正解:$link-cut tree$

這題的正解比較玄學。。

我們可以對於每一條路徑隨機乙個權值,兩個端點分別異或這個權值。

於是判斷一條邊是否在所有路徑上,只需判斷其中乙個點的子樹異或和是不是等於所有路徑的異或和就行了。這個正確率是很高的。。

然後就有乙個問題了,如何用動態樹來維護子樹?

其實很簡單。。我們可以另外維護一下乙個結點所有虛兒子的子樹異或和。這樣,我們就可以維護這個點在$lct$上整棵子樹了。我們只需在$access$,$link$操作中加一些東西,就能維護虛子樹了。

查詢子樹的時候,我們只需把當前點$access$,查詢虛子樹異或和,此時的虛子樹一定是它在原樹中的子樹。一些細節詳見**注釋。。

1

//it is made by wfj_2048~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include

14#define inf (1<<30)

15#define n (300010)

16#define il inline

17#define rg register

18#define ll long long

19#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

2021

using

namespace

std;

2223

struct edgee[n];

2425

int ch[n][2

],fa[n],sum[n],val[n],rev[n],st[n],n,m,s,tot;

26//

val為x和虛子樹的異或和,sum為x在lct中子樹異或和。

2728 il int

gi()

3536 il int isroot(rg int

x)39

40 il void pushup(rg int

x)43

44 il void pushdown(rg int

x)48

49 il void rotate(rg int

x)55

56 il void splay(rg int

x)66

rotate(x);67}

68return;69

}7071//

access的時候,我們需要改變虛子樹異或和。

72 il void access(rg int

x)79

return;80

}8182 il void makeroot(rg int

x)85

86//

link的時候,y也要makeroot,不然沒法維護y的祖先的val和sum。

87 il void link(rg int x,rg int

y)91

92 il void cut(rg int x,rg int

y)96

97 il void update(rg int x,rg int

v)100

101//

access以後,val維護的就是原子樹異或和。

102 il int query(rg int x,rg int

y)106

107 il void

work()

117if (opt==2

);120 update(x,z),update(y,z),s^=z;

121}

122if (opt==3

)126

if (opt==4

)130

}131

return

;132

}133

134int

main()

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維護子樹資訊 單點修改就是多維護乙個虛子樹資訊,改變虛邊的時候修改一下就好了。這個方...