題目描述:
輸入:
第一行兩個整數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...