BZOJ1036 LCT版 樹的統計Count

2022-05-27 15:39:08 字數 2874 閱讀 8021

description

一 棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作: i. change u t : 把結點u的權值改為t ii. qmax u v: 詢問從點u到點v的路徑上的節點的最大權值 iii. qsum u v: 詢問從點u到點v的路徑上的節點的權值和 注意:從點u到點v的路徑上的節點包括u和v本身

input

輸 入的第一行為乙個整數n,表示節點的個數。接下來n – 1行,每行2個整數a和b,表示節點a和節點b之間有一條邊相連。接下來n行,每行乙個整數,第i行的整數wi表示節點i的權值。接下來1行,為乙個整數 q,表示操作的總數。接下來q行,每行乙個操作,以「change u t」或者「qmax u v」或者「qsum u v」的形式給出。 對於100%的資料,保證1<=n<=30000,0<=q<=200000;中途操作中保證每個節點的權值w在-30000到 30000之間。

output

對於每個「qmax」或者「qsum」的操作,每行輸出乙個整數表示要求輸出的結果。

sample input

4

1 22 3

4 14 2 1 3

12qmax 3 4

qmax 3 3

qmax 3 2

qmax 2 3

qsum 3 4

qsum 2 1

change 1 5

qmax 3 4

change 3 6

qmax 3 4

qmax 2 4

qsum 3 4

sample output

412

21065

6516

hint

【分析】

隨便寫了乙個lct的版本,比樹鏈剖分慢...

現在發現lct真是個好東西,好寫又有用。

1/*2

唐代白居易

3《白雲泉》

4天平山上白雲泉,雲自無心水自閑。

5何必奔沖山下去,更添波浪向人間。 6*/

7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include

15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22

#define local

23const

int inf = 0x7fffffff;24

const

int maxn = 30000 + 10;25

const

int maxnode = 1000000;26

const

int maxm= 30000 * 2 + 10;27

using

namespace

std;

2829

struct

link_cut_treenode[maxn], *cur, _null, *null

;36 node *tmp[maxn];

3738

bool is_root(node* t)

42//

本來以為不要pushdown了,結果還是要

43void pushdown(node *t) 51}

52//

更新 53

void update(node *t)

61void

init()

69 node* new(int

val)

75void rotate(node *t, int

d)85 t->ch[d] =p;

86 p->parent =t;

87update(t);

88 update(p);//

真逗,什麼都不要

89}

90//

將t旋轉到根

91void splay(node *t)

107update(t);

108}

109update(t);

110}

111 node* access(node *t)

121return

p;122

}123

//合併u,v所在的樹

124void merge(node *u, node *v)

131void cut(node *u, node *v)

141//

找根 142 node *find(node *t)

148bool check(node *u, node *v)

153void change(node *l, int

x)159

}splay;

160int

n, m;

161int

u[maxn] , v[maxn];

162163

void

init()

172for (int i = 1; i < n; i++)

173 splay.merge(splay.node + u[i], splay.node +v[i]);

174}

175void

work()else

if (str[0] == 'q'

)else

199}

200}

201}

202203

intmain ()

view code

bzoj1036 樹的統計 樹鏈剖分 LCT

ac通道 題解 看到題目,發現是樹剖一眼題,所以就秒掉了。include include include include include include includeusing namespace std typedef long long ll define file read define m...

bzoj1036 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...

Bzoj1036 樹的統計

一棵 樹上有n 個節點,編號分別 為1到n 每個節 點都有一 個權值w 我們將 以下面的 形式來要 求你對棵 樹完成一 些操作 1.把結 點u的權 值改為t 2.詢問 從點u到 點v的路 徑上的節 點的最大 權值3.詢問 從點u到 點v的路 徑上的節 點的權值 和 注意 從點u 到點v的 路徑上的 ...