大致题意: 有一棵初始边权全为\(1\)的树,四种操作:将两点间路径边权都加上一个数,删一条边、加一条新边,将两点间路径边权都加上一个数,询问两点间路径权值和。
序列版
这道题有一个序列版:。
看题目就知道是一道线段树板子题。
这种题目移到树上路径中,且要删边加边,是无疑了。
\(LCT\)维护懒惰标记
可以说,这道题就是上面那题的翻版。
同样维护两个标记:乘法标记和加法标记,加上原有的翻转标记,共三个标记。
具体细节其实可以详见上面提到的那道线段树板子题,这里就不多说了。
主要是要注意标记下传与更新的优先级问题,应该是乘法先,加法后,至于翻转标记在前在后都无所谓。
代码
#include#define N 100000#define MOD 51061#define swap(x,y) (x^=y^=x^=y)#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))using namespace std;int n,ee,lnk[N+5];class Class_FIO{ private: #define Fsize 100000 #define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,Fsize,stdin),A==B)?EOF:*A++) #define pc(ch) (FoutSize