传送门:洛谷   BZOJ

还不会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】染色的更多相关文章

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

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

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

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

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

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

  4. BZOJ 2243 染色

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

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

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

  6. BZOJ 2243 染色 树链剖分

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

  7. BZOJ - 2243 染色 (LCT链修改+链查询)

    同样是可以用LCT解决的树剖问题之一. 注意反转的时候要考虑对左右端点颜色的影响,而且要先反转再打标记(这点不知道为啥) #include<bits/stdc++.h> using nam ...

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

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

  9. hysbz 2243 染色(树链剖分)

    题目链接:hysbz 2243 染色 题目大意:略. 解题思路:树链剖分+线段树的区间合并,可是区间合并比較简单,节点仅仅要记录左右端点的颜色就可以. #include <cstdio> ...

  10. BZOJ 2243: [SDOI2011]染色 [树链剖分]

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

随机推荐

  1. 【转】如何让虚拟目录里面的webconfig不继承网站的设置

    [转]http://www.cnblogs.com/Sue_/articles/2037556.html 必須在上一层虚拟目录(如根目录)所在的Web.config加上 如:<location ...

  2. java入门的语法学习

    用java语言写了一个求两个数最大公约数的程序: import java.io.*; import java.util.*; import java.math.*; public class Main ...

  3. XML文件的特点

    1.这个东西的规则比较简单,并且人眼看起来也比较容易理解,结构上也比较好操作,并且并无与任何编程语言绑定. 所以,很多编程语言就都为XML这个东西编写了读写XML的库,所以XML看起来所谓的通用,其实 ...

  4. 语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;目标检测只有两类,目标和非目标,就是在一张图片中找到并用box标注出所有的目标.

    from:https://blog.csdn.net/u012931582/article/details/70314859 2017年04月21日 14:54:10 阅读数:4369 前言 在这里, ...

  5. 使用chrome的F12开发人员工具进行网页前端性能测试

    用chrome访问被测网站,定位到你要测试的动作所在页面或被测页面的前一页.按F12调出开发人员工具,其它的功能我就不介绍了,直接切换到性能选项卡Profiles. 点击start,生成ProFile ...

  6. Linux_学习_01_ 压缩文件夹

    二.参考资料 1.Linux下压缩某个文件夹命令

  7. c++类之间的关系

    我们知道,表达方式分为很多种,对于同一种事物,比如爱情,画家用图画和色彩表达爱恋:音乐家用音符和节奏表达喜爱之情,作家用文字表现爱慕. 而程序员怎么办? 程序员构建类,用类来表达单身之苦.因此,类就是 ...

  8. 华为机试题 N阶楼梯的走法,每次走一步或者两步

    在Stairs函数中实现该功能: 一个楼梯有N阶,从下往上走,一步可以走一阶,也可以走两阶,有多少种走法? (0<n<=30)<> 例如3阶楼梯有3种走法: 1.1.1 1.2 ...

  9. 淘宝双十一页面(Flexible)

    以下demo点我下载 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  10. zjoi2015d1题解

    闲来无事做了丽洁姐姐的题 t1给一棵树 每个点有点权 每次修改点权 修改后询问每个点到树的带权重心的带权距离是多少 每个点度数不超过20 很显然的一个点分树... 我们记一下 每个点的子树中的所有点到 ...