【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 ...
随机推荐
- property 中的strong 与weak
strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *string1; @property ...
- 【html学习整理】meta,img,表格,表单
meta标签: 作用: 给搜索引擎用 . 告诉浏览器是什么编码 <meta charset="UTF-8"> <meta name="keywords& ...
- android自定义控件(二) 入门,继承View
转载请注明地址:http://blog.csdn.net/ethan_xue/article/details/7313788 ps: 可根据apidemo里LableView,list4,list6学 ...
- Java之动态代理简介
图截于<大话设计模式> Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 用户可以更 ...
- NCEE2018游记
前言 悠闲的高中生活结束啦.俺たちの戦いはこれからだ!(无误) Day0 看考场 听考前教育,前面还挺常规,后面讲了半个多小时相关法律,听了几句后实在没兴趣了,开始瞎想.那个人连续读了近一个小时也不嫌 ...
- Balloon Comes! hdu(小数位数处理)
Balloon Comes! Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...
- java的clone()的使用
clone()方法的约定 首先明确的是clone()是object的方法.Cloneable接口没有任何方法,它只起到标识的作用.(java的原型模式有用到) Cloneable接口的目的是作为对象的 ...
- exsi thick convert to thin
http://gaoming.blog.51cto.com/822334/1176139
- 【235】Win10-Chrome 临时视频文件夹
参考:巧妙利用Chrome浏览器缓存保存网络视频参考:Win7谷歌Chrome缓存文件位置如何查看? 启动Chrome浏览器 在Chrome浏览器的地址栏输入Chrome:Version查看Chrom ...
- win10 安装nodejs,报错there is a problem in the windows installer package
今天重装了win10系统,开始安装各种软件,装到node的时候我崩溃了,报错there is a problem in the windows installer package··· 度娘了各种安装 ...