数据结构 ·

BZOJ2631 tree LCT+标记

题目

Description
一棵n个点的树,每个点的初始权值为1。对于这棵树有q个操作,每个操作为以下四种操作之一:
+ u v c:将u到v的路径上的点的权值都加上自然数c;
- u1 v1 u2 v2:将树中原有的边(u1,v1)删除,加入一条新边(u2,v2),保证操作完之后仍然是一棵树;
* u v c:将u到v的路径上的点的权值都乘上自然数c;
/ u v:询问u到v的路径上的点的权值和,求出答案对于51061的余数。

Input
第一行两个整数n,q
接下来n-1行每行两个正整数u,v,描述这棵树
接下来q行,每行描述一个操作

Output
对于每个/对应的答案输出一行

Sample Input
3 2
1 2
2 3
* 1 3 4
/ 1 1

Sample Output
4

数据规模和约定
10%的数据保证,1<=n,q<=2000
另外15%的数据保证,1<=n,q<=5*10^4,没有-操作,并且初始树为一条链
另外35%的数据保证,1<=n,q<=5*10^4,没有-操作
100%的数据保证,1<=n,q<=10^5,0<=c<=10^4

LCT入门第二题,涉及路径上的基本标记操作。

个人认为坑点主要在乘法和加法标记的处理上。一开始采用的是加法操作遇到乘法标记就下放乘法标记,但是怎么调都过不去,和std拍了拍发现错的不太多,后来改成了两个标记同时存在,加法不影响乘法,但是乘法标记时要同时对加法标记产生影响,乘法时注意爆int的问题,也就没啥了。

 

参与评论