雨天的尾巴(bzoj3307)(线段树合并+树上差分)
\(N\)个点,形成一个树状结构。有\(M\)次发放,每次选择两个点\(x,y\)
对于\(x\)到\(y\)的路径上(含\(x,y\))每个点发一袋\(Z\)类型的物品。完成
所有发放后,每个点存放最多的是哪种物品。
Input
第一行数字\(N\),\(M\)
接下来\(N-1\)行,每行两个数字\(a,b\),表示\(a\)与\(b\)间有一条边
再接下来\(M\)行,每行三个数字\(x,y,z\).如题
Output
输出有\(N\)行
每i行的数字表示第\(i\)个点存放最多的物品是哪一种,如果有
多种物品的数量一样,输出编号最小的。如果某个点没有物品
则输出0
Sample Input
20 50
8 6
10 6
18 6
20 10
7 20
2 18
19 8
1 6
14 20
16 10
13 19
3 14
17 18
11 19
4 11
15 14
5 18
9 10
12 15
11 14 87
12 1 87
14 3 84
17 2 36
6 5 93
17 6 87
10 14 93
5 16 78
6 15 93
15 5 16
11 8 50
17 19 50
5 4 87
15 20 78
1 17 50
20 13 87
7 15 22
16 11 94
19 8 87
18 3 93
13 13 87
2 1 87
2 6 22
5 20 84
10 12 93
18 12 87
16 10 93
8 17 93
14 7 36
7 4 22
5 9 87
13 10 16
20 11 50
9 16 84
10 17 16
19 6 87
12 2 36
20 9 94
9 2 84
14 1 94
5 5 94
8 17 16
12 8 36
20 17 78
12 18 50
16 8 94
2 19 36
10 18 36
14 19 50
4 12 50
Sample Output
87
36
84
22
87
87
22
50
84
87
50
36
87
93
36
94
16
87
50
50
\(1<=N,M<=100000\)
\(1<=a,b,x,y<=N\)
\(1<=z<=1e9\)
题意
中文题面,不解释
题解:
先用树上差分的思想,确定哪个点上要加点,哪个点上要减点。然后用线段树合并,边\(dfs\)边合并更新,然后最后查询每个点对应的根上的值就行了。