同样是可以用LCT解决的树剖问题之一。

注意反转的时候要考虑对左右端点颜色的影响,而且要先反转再打标记(这点不知道为啥)

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
int n,m,a[N],col[N][],fa[N],ch[N][],sum[N],flp[N],sta[N],tp,lz[N];
#define ls(u) ch[u][0]
#define rs(u) ch[u][1]
int sf(int u) {return u==rs(fa[u]);}
bool isrt(int u) {return u!=ls(fa[u])&&u!=rs(fa[u]);}
void pu(int u) {
sum[u]=,col[u][]=col[u][]=a[u];
for(int f=; f<; ++f)if(ch[u][f]) {
sum[u]+=sum[ch[u][f]];
col[u][f]=col[ch[u][f]][f];
if(col[ch[u][f]][f^]==a[u])--sum[u];
}
}
void change(int u,int x) {if(u)a[u]=col[u][]=col[u][]=lz[u]=x,sum[u]=;}
void rev(int u) {flp[u]^=,swap(ls(u),rs(u)),swap(col[u][],col[u][]);}
void pd(int u) {
if(flp[u])rev(ls(u)),rev(rs(u)),flp[u]=;;
if(~lz[u])change(ls(u),lz[u]),change(rs(u),lz[u]),lz[u]=-;
}
void rot(int u) {
int v=fa[u],f=sf(u);
if(!isrt(v))ch[fa[v]][sf(v)]=u;
ch[v][f]=ch[u][f^],fa[ch[v][f]]=v;
fa[u]=fa[v],ch[u][f^]=v,fa[v]=u,pu(v);
}
void splay(int u) {
sta[tp=]=u;
for(int v=u; !isrt(v); v=fa[v])sta[++tp]=fa[v];
for(; ~tp; pd(sta[tp--]));
for(; !isrt(u); rot(u))if(!isrt(fa[u])&&sf(fa[u])==sf(u))rot(fa[u]);
pu(u);
}
void access(int u) {for(int v=; u; splay(u),rs(u)=v,pu(u),u=fa[v=u]);}
void makert(int u) {access(u),splay(u),rev(u);}
void link(int u,int v) {makert(u),fa[u]=v;}
void split(int u,int v) {makert(u),access(v),splay(v);}
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i)scanf("%d",&a[i]),lz[i]=-,pu(i);
for(int i=; i<n; ++i) {
int u,v;
scanf("%d%d",&u,&v);
link(u,v);
}
while(m--) {
char ch;
int x,y,z;
scanf(" %c%d%d",&ch,&x,&y);
if(ch=='C')scanf("%d",&z),split(x,y),change(y,z);
else split(x,y),printf("%d\n",sum[y]);
}
return ;
}

最新文章

  1. [No0000A3]护眼谎言大揭秘,选择正确的方式保护眼睛!
  2. scikit-learn包的学习资料
  3. Git 的origin和master分析
  4. 20145320《Java程序设计》第9周学习总结
  5. 51. Word Search
  6. Linq To Entities 及其相关
  7. PL/pgSQL多输出参数例子
  8. Microsoft.Xna.Framework.TitleContainer.OpenStream()
  9. Visual Studio 2015 Update 3 RC 候选预览版粗来了
  10. SQL 建表 插数据
  11. java super关键字
  12. tp5框架的获取器
  13. python-文件读写
  14. bzoj2819 DFS序 + LCA + 线段树
  15. Luogu1081 NOIP2012 开车旅行 倍增
  16. IOP知识点(4)
  17. 洛谷 4364 [九省联考2018]IIIDX——“预留”的思路
  18. 如何从windows中拷贝文件到linux (ubuntu)??
  19. 将JDBC的resultSet映射到JavaBaen
  20. Cordova - XCode10编译热更新插件错误解决方法!

热门文章

  1. Centos 7 安装tomcat并部署jar实录
  2. 安装MySQL Enterprise Monitor
  3. python一些包
  4. Flask扩展包之flask-admin
  5. oracle 在sql中显示blob的字符串
  6. linux-yum-downloadonly 下载rpm安装包到本地
  7. Layui数据表格模型
  8. php常用header状态
  9. 虚机Linux最小系统下安装图形界面,与yum配置
  10. 开发跨平台应用解决方案-uniapp 真心不错,支持一波