第一次聽說 lct 還可以維護子樹資訊。
首先對於每一條路徑 rand 乙個值,分別放在兩個端點上,於是詢問一條邊是否被所有路徑的經過就變成了詢問某一邊所代表的子樹是否包含所有路徑的端點各一次。於是我求出子樹 xor ,並與當前所有路徑值的 xor 比較是否相同就可以判斷了。
於是接下來就變成了 lct 維護子樹 xor 。
考慮在 lct 的時候,再對於每乙個節點維護其虛兒子的資訊。由於 lct 涉及虛兒子的操作十分少,所以只需要在修改邊的虛實關係的時候順便維護一下就好了。
時間複雜度 $o((n+m)\log n)$ 。
#include #define link __zzd001using namespace std;
typedef long long ll;
int read()
const int n=100005;
int n,m,id;
int fa[n],son[n][2],rev[n],val[n],sum[n];
void pushup(int x)
int isroot(int x)
int wson(int x)
void rotate(int x)
void pushdown(int x)
}void pushadd(int x)
void splay(int x)
void access(int x)
}void rever(int x)
void link(int x,int y)
void cut(int x,int y)
int randv[n*3],rands=0,cnt=0;
pair path[n*3];
int randint()
int main()
while (m--)
else if (opt==2)
else if (opt==3)
else if (opt==4)
} return 0;
}
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維護子樹資訊 單點修改就是多維護乙個虛子樹資訊,改變虛邊的時候修改一下就好了。這個方...