#include <cstdio> #include <cstring> #include <cstdlib> using namespace std; const int N=100001; int n,m,color[N]; //Basic struct G { int v,nxt; }map[N+N]; int hd[N],tt; //Graph int son[N],dep[N],pre[N],size[N]; int tid[N],top[N],num; //…
#include<cstdio> #include<iostream> #define M 1000006 #define N 1000006 using namespace std; ],f1[N],cnt,dui[N],lian[N],tim,l1,l2; int r1; struct data { int l,r,sum,tag; }shu[*N]; void jia(int a1,int a2) { cnt++; next[cnt]=head[a1]; head[a1]=c…
题意: 给出一棵树,每个顶点上有个颜色\(c_i\). 有两种操作: C a b c 将\(a \to b\)的路径所有顶点上的颜色变为c Q a b 查询\(a \to b\)的路径上的颜色段数,连续相同颜色视为一段 分析: 首先树链剖分,下面考虑线段树部分: 我们维护一个区间的左端点的颜色和右断点的颜色以及该区间的颜色段数,在加一个颜色覆盖标记. 在pushup的时候,如果左区间右端点颜色和右区间左端点颜色相同,那么这段颜色可以合并,合并区间的颜色段数为左右子区间颜色段数之和减1: 否则,答…