同样是可以用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 ;
}

BZOJ - 2243 染色 (LCT链修改+链查询)的更多相关文章

  1. BZOJ 2243 染色 (线段树+树链剖分)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 9895  Solved: 3735[Submit][Status ...

  2. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  3. BZOJ 2243 染色(树链剖分好题)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 7971  Solved: 2990 [Submit][Stat ...

  4. 树链剖分的一种妙用与一类树链修改单点查询问题的时间复杂度优化——2018ACM陕西邀请赛J题

    题目描述 有一棵树,每个结点有一个灯(初始均是关着的).每个灯能对该位置和相邻结点贡献1的亮度.现有两种操作: (1)将一条链上的灯状态翻转,开变关.关变开: (2)查询一个结点的亮度. 数据规模:\ ...

  5. BZOJ 2243 染色 树链剖分

    题意: 给出一棵树,每个顶点上有个颜色\(c_i\). 有两种操作: C a b c 将\(a \to b\)的路径所有顶点上的颜色变为c Q a b 查询\(a \to b\)的路径上的颜色段数,连 ...

  6. BZOJ - 2243 染色 (树链剖分+线段树+区间合并)

    题目链接 线段树维护区间连续段个数即可.设lc为区间左端点颜色,rc为区间右端点颜色,则合并两区间的时候,如果左区间右端点和右区间左端点颜色相同,则连续段个数-1. 在树链上的区间合并可以定义一个结构 ...

  7. BZOJ 2243 染色

    树链剖分+区间染色 因为是一颗树不是森林,所以应该用树剖就行,但是LCT好像也能写.. 直接用线段树维护树上的节点,注意pushdown还有询问的时候要考虑区间相交的地方,也就是左孩子右边和有孩子的左 ...

  8. [BZOJ 2243] [SDOI 2011] 染色 【树链剖分】

    题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————— ...

  9. HDU 3966 Aragorn's Story (树链点权剖分,成段修改单点查询)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 树链剖分的模版,成段更新单点查询.熟悉线段树的成段更新的话就小case啦. //树链剖分 边权修 ...

随机推荐

  1. python之openpyxl生成excel文件

    项目需要,需要自动生成PDF测试报告.经过对比之后,选择使用了reportlab模块. 项目背景:开发一个测试平台,供测试维护测试用例,执行测试用例,并且生成测试报告(包含PDF和excel),将生成 ...

  2. When specified, "proxy" in package.json must be a string.

    react项目在package.json中配置proxy之后,报错 $ npm run start > img@ start D:\xx\src\img > react-scripts s ...

  3. Json序列化日期/Date(xxxx)/ JS转化为常用日期格式

    记录开发过程中的代码片段,方便日后归纳.总结,效果如图所示: 转换前:    转换后: 代码如下,需要的朋友们自取: //JS转化为json常用日期格式 function FormatToDate(v ...

  4. Java重写祖先类方法equals示例

    Java中很重要的一个知识点就是所有类都默认继承Object类,所以创建的每一个类都继承了Object的方法,所有类都可以向上转型为Object类对象,当然可以重写Object里面的常用方法,有时候重 ...

  5. 小型自动化运维工具pssh和传输工具rsync

    一.简单介绍 1.pssh全称是parallel-ssh,基于Python编写的并发在多台服务器上批量执行命令的工具.包括pssh,pscp,prsync,pnuke和pslurp.该项目包括pssh ...

  6. 笔记纪要:C# WebService URL重写

    背景# 有时候我们会有这样的需求,将 WebService URL 中的 asmx 后缀去掉:或者我们要模拟普通 Web 的 URL,接口名称直接拼接在 URL 中.这些情况我们都要用到URL重写. ...

  7. reactstrap,scrollbar组件

    react-script 编译,部署,sass,less,test,helmet等 https://github.com/facebookincubator/create-react-app/blob ...

  8. Elasticsearch-数据的存储、搜索(干货)

    ES-深入功能ES中数据是如何组织的?逻辑设计:用于索引和搜索的基本单位是文档,可以将其认为是关系数据库里的一行.文档以类型来分组,类型包含若干文档,类似表格包含若干行.最终,一个或多个类型存在于同一 ...

  9. Ubuntu 19.04

    Ubuntu 19.04自动挂载机械盘 创建要挂载的文件夹 sudo mkdir /home/soldier/SOLDIER 获取UUID sudo blkid 分区的TYPE是“ntfs” 编辑/e ...

  10. npm学习(六)之如何创建 Node.js 模块

    如何创建 Node.js 模块 Node.js 模块是一种可以发布到 npm 的包.当你创建一个新模块时,创建 package.json 文件是第一步. 你可以使用 npm init 命令创建 pac ...