您的位置:首页 > 其它

bzoj3306 树

2016-01-22 21:42 274 查看

3306: 树

Time Limit: 10 Sec Memory Limit: 256 MB

Submit: 597 Solved: 185

[Submit][Status][Discuss]

Description

给定一棵大小为 n 的有根点权树,支持以下操作:

  • 换根

  • 修改点权

 • 查询子树最小值

Input

  第一行两个整数 n, Q ,分别表示树的大小和操作数。

  接下来n行,每行两个整数f,v,第i+1行的两个数表示点i的父亲和点i的权。保证f < i。如 果f = 0,那么i为根。输入数据保证只有i = 1时,f = 0。

  接下来 m 行,为以下格式中的一种:

  • V x y表示把点x的权改为y

  • E x 表示把有根树的根改为点 x

  • Q x 表示查询点 x 的子树最小值

Output

  对于每个 Q ,输出子树最小值。

Sample Input

3 7

0 1

1 2

1 3

Q 1

V 1 6

Q 1

V 2 5

Q 1

V 3 4

Q 1

Sample Output

1

2

3

4

HINT

  对于 100% 的数据:n, Q ≤ 10^5。

Source

树上单点修改、子树查询,很明显DFS序+线段树。
唯一的问题就是换根操作怎么处理?
其实我们不需要改变树的形状,只需要记录当前根是哪个节点。每次询问时判断根和询问节点x的位置关系。
① 如果x是根,则输出整棵树的最小值。
② 如果x是根的祖先,则找到根的子树中最接近x的节点y,输出整棵树减去y的子树的最小值。
③ 如果x既不是根也不是根的祖先,则输出x的子树的最小值。
一开始RE了很多次,因为query中没有判断l>r(其实现在也不是特别懂)。之后又WA了很多次,因为找节点y的倍增算法写错了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: