【BZOJ 2243】染色
还不会LCT的小伙伴可以看一下这篇博客:LCT总结
我初学动态树时就是看着那篇博客学的,写的很好!
那好 言归正传。
显然树上 x 到 y 的路径的问题都可以用LCT Access一下把路径剖离出来,那主要问题在于如何用Splay 来维护颜色呢?
上图(XP 灵魂画手)

对于Splay树的每一个节点,维护四个信息
c[x] : 节点本身的颜色
cL[x]: 节点对应子树最左端的颜色
cR[x]: 节点对应子树最右端的颜色
tot[x]: 节点对应子树区间的颜色段数
所以upDATA的时候就很显然啦~
void pUP(int x){
int lc=ch[x][],rc=ch[x][];
cL[x]= lc? cL[lc]:c[x];
cR[x]= rc? cR[rc]:c[x];
if(lc && rc) tot[x]=tot[lc]+tot[rc]+-(cR[lc]==c[x])-(cL[rc]==c[x]);
if(lc &&!rc) tot[x]=tot[lc]+-(cR[lc]==c[x]);
if(!lc&& rc) tot[x]=tot[rc]+-(cL[rc]==c[x]);
if(!lc&&!rc) tot[x]=;
}
其他部分就和平常的LCT没有什么区别了
哦 对,pushDOWN时要注意 区间翻转,cL和cR要一起翻
全代码~
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> #define For(i,a,b) for(register int i=a;i<=b;++i)
#define Dwn(i,a,b) for(register int i=a;i>=b;--i)
#define Pn putchar('\n')
#define I inline
#define Re register using namespace std; const int N=1e5+; int ch[N][],fa[N],c[N],cL[N],cR[N],tot[N],tag[N],st[N],top,tgC[N];
int n,m,x,y,z;
char opt; I void read(int &v){
v=;
char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')v=v*+c-'',c=getchar();
}
void write(int x){
if(x>)write(x/);
int xx=x%;
putchar(xx+'');
}
I bool NOrt(int x){
return ch[fa[x]][]==x || ch[fa[x]][]==x;
}
I void pTAG(int x){
swap(ch[x][],ch[x][]);
swap(cL[x],cR[x]);
tag[x]^=;
}
I void pTGC(int x,int Col){
c[x]=cL[x]=cR[x]=Col;
tot[x]=;
tgC[x]=Col;
}
I void pDOWN(int x){
if(tag[x]){
if(ch[x][])pTAG(ch[x][]);
if(ch[x][])pTAG(ch[x][]);
tag[x]^=;
}
if(tgC[x]){
if(ch[x][])pTGC(ch[x][],tgC[x]);
if(ch[x][])pTGC(ch[x][],tgC[x]);
tgC[x]=;
}
}
I void pUP(int x){
int lc=ch[x][],rc=ch[x][]; cL[x]= lc? cL[lc]:c[x];
cR[x]= rc? cR[rc]:c[x]; if(lc && rc) tot[x]=tot[lc]+tot[rc]+-(cR[lc]==c[x])-(cL[rc]==c[x]); if(lc &&!rc) tot[x]=tot[lc]+-(cR[lc]==c[x]); if(!lc&& rc) tot[x]=tot[rc]+-(cL[rc]==c[x]); if(!lc&&!rc) tot[x]=;
}
I bool Wson(int x){
return ch[fa[x]][]==x;
}
I void Rotate(int x){
int y=fa[x];
int z=fa[y];
int ws=Wson(x);
if(NOrt(y))ch[z][Wson(y)]=x;
fa[x]=z; ch[y][ws]=ch[x][ws^];
if(ch[x][ws^])fa[ch[x][ws^]]=y; ch[x][ws^]=y;
fa[y]=x; pUP(y); pUP(x);
}
I void Splay(int x){
top=; int now=x;
st[++top]=now;
while(NOrt(now))st[++top]=now=fa[now];
while(top) pDOWN(st[top--]); while(NOrt(x)){
int y=fa[x];
if(NOrt(y)){
if(Wson(y)==Wson(x))Rotate(y);
else Rotate(x);
}
Rotate(x);
}
}
I void Access(int x){
int lst=;
while(x){
Splay(x); ch[x][]=lst; pUP(x);
lst=x; x=fa[x];
}
}
I void ChangeRt(int x){
Access(x); Splay(x); pTAG(x);
}
I void Link(int x,int y){
ChangeRt(x); fa[x]=y;
}
I void Split(int x,int y){
ChangeRt(x); Access(y); Splay(y);
}
int main(){
read(n); read(m);
For(i,,n){
read(c[i]); tot[i]=;
cL[i]=cR[i]=c[i];
};
For(i,,n-){
read(x); read(y);
Link(x,y);
}
For(i,,m){
opt=getchar();
while(opt!='C'&&opt!='Q')opt=getchar();
if(opt=='C'){
read(x); read(y); read(z);
Split(x,y); pTGC(y,z);
}
if(opt=='Q'){
read(x); read(y);
Split(x,y);
write(tot[y]); Pn;
}
}
return ;
}
【BZOJ 2243】染色的更多相关文章
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- BZOJ 2243 染色(树链剖分好题)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 7971 Solved: 2990 [Submit][Stat ...
- BZOJ 2243 染色 (线段树+树链剖分)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9895 Solved: 3735[Submit][Status ...
- BZOJ 2243 染色
树链剖分+区间染色 因为是一颗树不是森林,所以应该用树剖就行,但是LCT好像也能写.. 直接用线段树维护树上的节点,注意pushdown还有询问的时候要考虑区间相交的地方,也就是左孩子右边和有孩子的左 ...
- BZOJ - 2243 染色 (树链剖分+线段树+区间合并)
题目链接 线段树维护区间连续段个数即可.设lc为区间左端点颜色,rc为区间右端点颜色,则合并两区间的时候,如果左区间右端点和右区间左端点颜色相同,则连续段个数-1. 在树链上的区间合并可以定义一个结构 ...
- BZOJ 2243 染色 树链剖分
题意: 给出一棵树,每个顶点上有个颜色\(c_i\). 有两种操作: C a b c 将\(a \to b\)的路径所有顶点上的颜色变为c Q a b 查询\(a \to b\)的路径上的颜色段数,连 ...
- BZOJ - 2243 染色 (LCT链修改+链查询)
同样是可以用LCT解决的树剖问题之一. 注意反转的时候要考虑对左右端点颜色的影响,而且要先反转再打标记(这点不知道为啥) #include<bits/stdc++.h> using nam ...
- [BZOJ 2243] [SDOI 2011] 染色 【树链剖分】
题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————— ...
- hysbz 2243 染色(树链剖分)
题目链接:hysbz 2243 染色 题目大意:略. 解题思路:树链剖分+线段树的区间合并,可是区间合并比較简单,节点仅仅要记录左右端点的颜色就可以. #include <cstdio> ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
随机推荐
- 20145239 杜文超《Java程序设计》课程总结
<每周读书笔记链接汇总> 第一周读书笔记:http://www.cnblogs.com/dwc929210354/p/5247666.html 第二周读书笔记:http://www.cnb ...
- uboot 2013.01 代码简析(2)第一阶段初始化
uboot执行"make smdk2410_config"之后就可以进行编译了,可以执行make命令进行编译, 因为整个输出太长,我仅仅列出部分最关键的输出(部分我不关心的内容直接 ...
- easyui datagrid行合并
easyui datagrid行合并 合并方法 /** * EasyUI DataGrid根据字段动态合并单元格 * 参数 tableID 要合并table的id * 参数 colList 要合并的列 ...
- html5实现进度条功能效果非常和谐
1. [图片] html5.jpg 2. [代码][HTML]代码 <script type="text/javascript"> var i = 0; ...
- HDU 2157 How many ways??:矩阵快速幂【i到j共经过k个节点的方法数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2157 题解: 给你一个有向图,n个节点m条边,问你从i到j共经过k个节点的方法数(不算i点). 题解: ...
- Java微信公众平台开发_03_消息管理之被动回复消息
GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.回调url 上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图, ...
- js_调试_01_14 个你可能不知道的 JavaScript 调试技巧
更快更高效地调试你的 JavaScript 了解你的工具在完成任务时有很重要的意义. 尽管 JavaScript 是出了名的难以调试,但是如果你掌握了一些小技巧,错误和 bug 解决起来就会快多了. ...
- (转)RTSP协议详解
转自:https://www.cnblogs.com/lidabo/p/6553212.html RTSP简介 RTSP(Real Time Streaming Protocol)是由Real ...
- properties文件的解析
此文章是从网上看到一篇实用小文章,感觉不过,摘录下来的!如有问题,可及时联系,可立刻做相应处理! Java读取.properties 配置文件的几种方法 在做java工程时, 经常会将一些配置信息放到 ...
- hdu-5780 gcd(数学)
题目链接: gcd Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Pro ...