【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 ...
随机推荐
- 2018年东北农业大学春季校赛 E wyh的集合 【数学】
题目链接 https://www.nowcoder.com/acm/contest/93/F 思路 其实容易知道在两个不同集合里 假设元素个数 分别为 a b 然后对于第一个集合里的每一个元素 都可以 ...
- Cocoapods的安装以及使用
在网上看博客,看了好多次,都没有学会cocoapods,今天上午浪费了一上午的时间,终于算是学会了.其实也是很简单的. iOS 新版 CocoaPods 安装流程 1.换掉现有Ruby默认源(由于好多 ...
- 《avascript 高级程序设计(第三版)》 ---第三章 基本概念
本章主要介绍Javasript语言的一些语法: 1.严格模式:开启:"use strict"; 2.变量:全部用var来定义,在函数中使用的称为局部变量,不能全局使用. 3.数据类 ...
- Spring Boot2.0之统一处理web请求日志
试问,你的项目中,如果有几万个方法,你还这么写log.info("name"+name+",age"+age )日志么?low~ 所以用AOP呀 1.首先创建个 ...
- Java编程思想(18~22)
第18章 Java I/O系统 18.1 File 类 18.1.1 目录列表器 18.1.2 目录实用工具 18.1.3 目录的检查及创建18.2 输入和输出 在Java 1.0中类库的设计者限定于 ...
- 如何解决GBK的编码的文件中的中文转换成为UTF-8编码的文件而且不乱码
首先我们必须明确一点,为什么正常转换会乱码? 因为我们的数据写入是GBK写入的,然后展示的话是按照文件保存形势展示的,前面保存形势是GBK,一致,所以不乱码,而后面将保存形势变成了UTF-8,但是写入 ...
- SSH中的Hibernate
SSH中的Hibernate 就是DAO连接数据库对数据进行实际操作,做了架构简化,对数据库的操作.
- leetcode 191 Number of 1 Bits(位运算)
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...
- 【Lintcode】159.Find Minimum in Rotated Sorted Array
题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...
- Restore Points 制定回退方案
Restore Points 制定回退方案 背景:Flashback Database 和 restore points 都可以提供一个基于时间点的回滚. 理论:1) Normal Restore P ...