原题链接:
poj
题意简述
多组数据。给定一个树,带边权,要支持三种操作,分别是:
- 两个节点之间的路径的边权全部 × − 1 \times -1 ×−1,即取相反数
- 单边修改边权值
- 求两个节点之间路径上的最长边
数据
输入
第一行一个 t t t,表示有 t t t组数据。对于每一个数据,先有一个 n n n,表示点数。然后 n − 1 n-1 n−1行,每行两个数 a , b , c a,b,c a,b,c表示 a , b a,b a,b之间有一个边,权值为 c c c。接下来是一些询问,先有一个字符串,如果是:
- “ N E G A T E NEGATE NEGATE” 后跟两个数 a , b a,b a,b,表示 a , b a,b a,b进行操作 1 1 1
- “ C H A N G E CHANGE CHANGE” 后跟两个数 i , w i,w i,w,表示将输入的第 i i i条边权改为 w w w
- “ Q U E R Y QUERY QUERY” 后跟两个数,表示 a , b a,b a,b进行操作 3 3 3
输出
对于每个操作三(即 Q U E R Y 形 式 给 出 的 操 作 QUERY形式给出的操作 QUERY形式给出的操作),输出答案
样例
输入
1
3
1 2 1
2 3 2
QUERY 1 2
CHANGE 1 3
QUERY 1 2
DONE
输出
1
3
思路
这显然是个树剖。做树剖的题,要先知道一个事情:
这个题放到链上怎么做。
然后用分块打到树上即珂。珂是,这个题放到链上怎么做呢?
part 1. 序列上做法
线段树。显然,维护最大值是好维护的,当然单点修改也能改。关键就是这个取相反数。如果一个区间整个取了相反数,那么你会发现:整个乘了 − 1 -1 −1后,最大值和最小值互换了。
举个栗子:
原区间: { 1 , − 10 , 2 , 9 } \{1,-10,2,9\} { 1,−10,2,9}
最大:9 最小:-10
取相反数: { − 1 , 10 , 2 , − 9 } \{-1,10,2,-9\} { −1,10,2,−9}
最大:10 最小:-9
是不是茅塞顿开!(我这个蒟蒻没想到这一点,爆肝调到 11 : 30 p . m . 11:30\ p.m. 11:30 p.m.才搞出来。。。)
所以链上会做了,就是放到树上的问题了。
part 2.放到树上
我们发现,树链剖分都是对点权进行操作的,那么,边权呢?
会发现,每一个边都连接着一对父子。如果我们把边权,丢到这个边的儿子上,会发现:
每个儿子唯一对应一个边(根除外,根不对应边)
所以,我们就考虑用儿子的点权表示边权。但是注意,在取答案和修改的时候,要做出一些改动。举个栗子:(我们的树长这样)
blog1.png
然后我们要对点 3 ,