UOJ207 共價大爺遊長沙

2022-03-26 07:31:13 字數 1109 閱讀 1671

link

我們知道一條邊被所有路徑經過就是其乙個端點的子樹中包含了所有路徑的一端。

那麼我們可以給每條路徑的端點rand乙個隨機權值,然後用lct維護子樹異或和,查詢就是看子樹異或和是否等於所有隨機權值的異或和。

lct維護子樹資訊+單點修改就是多維護乙個虛子樹資訊,改變虛邊的時候修改一下就好了。

這個方法的正確性還是挺高的,不過我不太會證。

#include#include#include#includeusing std::rand;

using std::swap;

namespace io

int read()

}using namespace io;

const int n=100007;

int ch[n][2],fa[n],rev[n],sum[n],val[n];

struct nodet[n*3];

#define lc ch[x][0]

#define rc ch[x][1]

int nroot(int x)

void pushup(int x)

void pushrev(int x)

void pushdown(int x)

void pushall(int x)

void rotate(int x)

void splay(int x)

void access(int x)

void makeroot(int x)

void link(int x,int y)

void cut(int x,int y)

void update(int x,int w)

#undef lc

#undef rc

int main()

;break;

case 3:u=read(),update(t[u].u,t[u].w),update(t[u].v,t[u].w),s^=t[u].w;break;

case 4:u=read(),v=read(),makeroot(u),access(v),puts(val[v]==s?"yes":"no");break;

}}

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 共價大爺遊長沙

uoj 這題真是太神啦!對於s集合中的每個點對,給他們隨機附上乙個相同權值。兩個點在邊 x,y 的兩側當且僅當乙個點在x的子樹中,另乙個點不在x的子樹中 假設x是y的兒子 維護一下子樹點權異或和,若x子樹的異或和等於所有點對權值的異或和就說明 x,y 是一條必經邊 splay終於使用正常方法寫 祭 ...