動態樹LCT 模板

2021-07-30 00:23:10 字數 1594 閱讀 5764

題目描述:

輸入:

第一行兩個整數n和m;

接下來一行中n個整數表示初始點權;

接下來m行每行乙個操作如上表所示。

輸出:

對於每乙個連線操作,若p和q不連通,輸出yes,並新增這條邊;否則輸出no;

對於每乙個刪除操作,若p和q間有邊,輸出yes,並刪除這條邊,否則輸出no;

對於每乙個查詢最大及查詢和,若p和q連通,輸出一行包含乙個整數為對應的答案;否則輸出乙個整數-1。

樣例輸入:

5 10

1 3 5 4 6

link 1 2

link 1 3

link 2 3

max 2 3

update 1 6

max 2 3

link 3 5

sum 3 5

cut 1 3

sum 1 5

樣例輸出:

yes

yes

no 5

6 yes

11 yes

-1**如下:

#include 

#include

#define n 50000

using namespace std;

inline int max(int x,int y)

int n,m,x,y;

char s[10];

struct splay*null=new splay(0),*root[n];

splay :: splay(int x)

void splay :: maintain()

int splay :: dir()

void splay :: reverse()

void splay :: push_down()

return;

}void splay :: push_up()

void turn(splay *c,int d)

void splaying(splay *c)

return;

}void access(splay *c)

return;

}void move_to_root(splay *c)

void link(splay *x,splay *y)

printf("yes\n");

x->fa=y;

return;

}void cut(splay *x,splay *y)

printf("yes\n");

y->ch[0]=null; y->maintain();

x->fa=null;

return;

}void query_max(splay *x,splay *y)

void query_sum(splay *x,splay *y)

int main()

while(m--)

}return

0;}

LCT動態樹 基礎模板(luogu P3690)

給定n個點以及每個點的權值,要你處理接下來的m個操作。操作有4種。操作從0到3編號。點從1到n編號。0 後接兩個整數 x,y 代表詢問從x到y的路徑上的點的權值的xor和。保證x到y是聯通的。1 後接兩個整數 x,y 代表連線x到y,若x到y已經聯通則無需連線。2 後接兩個整數 x,y 代表刪除邊 ...

詳解動態樹 LCT)

lct的功能 題意 乙個圖,有n個點,一開始圖中沒有邊。三種操作 connect u v 在點u和點v之間建一條邊。保證所有connect操作不會重複建邊。destroy u v 摧毀點u到點v之間的邊。保證所有destroy操作將摧毀的是一條存在的邊。query u v 詢問點u和點v是否聯通,是...

動態樹 LCT 錯誤總結

彙總犯過的一大堆神奇錯誤。例 node findroot node u return u 解決方法 寫完後搜尋所有 ch,檢查是否之前已pushdown 解決方法 使u uu結點懶標記意義表示u uu的兒子結點需更新,而不是u uu需要更新。懶標記下傳後未清空 例 void pushdown 例 n...