uoj 207 共價大爺遊長沙

2022-09-19 08:15:07 字數 1454 閱讀 9020

傳送門

lct維護子樹資訊。

加入一條路徑時給兩個端點x,y分別異或上rand出來的乙個權值,那麼若一條邊被所有路徑經過,即所有路徑的兩端點都分居這條邊的兩邊,那麼這條邊一端的子樹權值異或和為總的路徑的權值異或和。

跟上一道題一樣用lct維護子樹資訊即可。

1

//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 }

view code

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