uoj 207 共價大爺遊長沙

2021-07-28 01:10:23 字數 1013 閱讀 8142

miaom又來做lct了!//lych:無敵

由於不是很懂lct子樹資訊維護的那套理論,想了好久(搞得樹剖的子樹維護就會了一樣!)。

首先是乙個很巧妙的轉化——將邊在鏈上轉化為這條邊能將鏈的頂點分開。給每組頂賦乙個隨機權,每次可以把邊斷掉,查詢每個聯通塊內權值異或和是否等於所有頂點權值異或和,就是子樹異或和。

然後發現動態樹上子樹不是dfs序連續那麼簡單,他應該是(當前點及沿偏愛邊往下走得到的點)以及他們的虛邊的子樹。然後維護一些值(splay 區間虛兒子&自己和

單點&虛兒子和)。

lct的**來自@lbn187板子的默寫,如有錯誤不負責。。

#include#include#include#define n 300005

using namespace std;

int id,n,m,x,y,p,qx[n],qy[n],now,val[n],ly;

int c[n][2],fa[n],v[n],s[n],rev[n];

//子樹權值異或和

//splay 區間虛兒子&自己和 s

//單點&虛兒子和 v

//單點修改

bool rt(int x)

void rever(int x)

void up(int x)

void dn(int x)

void pd(int x)

void rot(int x)

void splay(int x,int y=0)

void acc(int x)

void mrt(int x)

void link(int x,int y)

void cut(int x,int y)

void mdy(int x,int y)

int qry(int x,int y)

int main()

else if (p==2)

else if (p==3)

else if (p==4)

}}

UOJ207 共價大爺遊長沙

uoj 神題 給每個點對隨機乙個權值,把這兩個點的權值異或上這個隨機的值 用l ctl ct 維護子樹資訊,若子樹異或和為所有點對的異或和那麼就是答案 大常數 include define rg register define il inline define fill a,b memset a,b...

UOJ207 共價大爺遊長沙

link 我們知道一條邊被所有路徑經過就是其乙個端點的子樹中包含了所有路徑的一端。那麼我們可以給每條路徑的端點rand乙個隨機權值,然後用lct維護子樹異或和,查詢就是看子樹異或和是否等於所有隨機權值的異或和。lct維護子樹資訊 單點修改就是多維護乙個虛子樹資訊,改變虛邊的時候修改一下就好了。這個方...

UOJ207 共價大爺遊長沙

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