BZOJ2243 [SDOI2011]染色(LCT)
明明是道树剖的题……
然而我硬生生做成了LCT
虽然的确用LCT只是板子啦(LCT的题哪道不是板子)
就是把颜色打上标记,然后基本就是板子
//minamoto
#include<bits/stdc++.h>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char obuf[<<],*o=obuf;
inline void print(int x){
if(x>) print(x/);
*o++=x%+;
}
const int N=;
int fa[N],s[N],ch[N][],col[N],lcol[N],rcol[N],tag[N],rev[N],tot[N],top;
inline bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
void pushup(int x){
lcol[x]=ch[x][]?lcol[ch[x][]]:col[x];
rcol[x]=ch[x][]?rcol[ch[x][]]:col[x];
tot[x]=;
if(ch[x][]) tot[x]+=tot[ch[x][]]-(rcol[ch[x][]]==col[x]);
if(ch[x][]) tot[x]+=tot[ch[x][]]-(lcol[ch[x][]]==col[x]);
}
inline void pushrev(int x){if(x) rev[x]^=,swap(ch[x][],ch[x][]),swap(lcol[x],rcol[x]);}
inline void change(int x,int y){if(x) tag[x]=col[x]=lcol[x]=rcol[x]=y,tot[x]=;}
inline void pushdown(int x){
if(rev[x]) pushrev(ch[x][]),pushrev(ch[x][]),rev[x]=;
if(tag[x]) change(ch[x][],tag[x]),change(ch[x][],tag[x]),tag[x]=;
}
void rotate(int x){
int y=fa[x],z=fa[y],d=ch[y][]==x;
if(!isroot(y)) ch[z][ch[z][]==y]=x;
fa[x]=z,fa[y]=x,fa[ch[x][d^]]=y,ch[y][d]=ch[x][d^],ch[x][d^]=y;pushup(y);
}
void splay(int x){
s[top=]=x;for(int i=x;!isroot(i);i=fa[i]) s[++top]=fa[i];
for(int i=top;i;--i) pushdown(s[i]);
for(int y=fa[x],z=fa[y];!isroot(x);y=fa[x],z=fa[y]){
if(!isroot(y)) ((ch[y][]==x)^(ch[z][]==y))?rotate(x):rotate(y);
rotate(x);
}
pushup(x);
}
void access(int x){for(int y=;x;x=fa[y=x]) splay(x),ch[x][]=y,pushup(x);}
void makeroot(int x){access(x),splay(x),pushrev(x);}
void split(int x,int y){makeroot(x),access(y),splay(y);}
void link(int x,int y){makeroot(x),fa[x]=y;}
void cut(int x,int y){split(x,y),fa[x]=ch[y][]=;}
int main(){
//freopen("testdata.in","r",stdin);
int n=read(),m=read();
for(int i=;i<=n;++i) col[i]=lcol[i]=rcol[i]=read(),tot[i]=;
for(int i=;i<n;++i){
int u=read(),v=read();
link(u,v);
}
while(m--){
char ch;
while((ch=getc())!='C'&&ch!='Q');
int a=read(),b=read();split(a,b);
if(ch=='C'){int k=read();change(b,k);}
else print(tot[b]),*o++='\n';
}
fwrite(obuf,o-obuf,,stdout);
return ;
}
BZOJ2243 [SDOI2011]染色(LCT)的更多相关文章
- BZOJ2243 SDOI2011 染色 【树链剖分】
BZOJ2243 SDOI2011 染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色 ...
- bzoj2243[SDOI2011]染色 树链剖分+线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9012 Solved: 3375[Submit][Status ...
- BZOJ2243: [SDOI2011]染色(树链剖分/LCT)
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如 ...
- [Bzoj2243][SDOI2011]染色(线段树&&树剖||LCT)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2243 线段树+树链剖分,在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色 ...
- 洛谷 P2486 [SDOI2011]染色 LCT
Code: #include <cstdio> //SDOI2010 染色 #include <algorithm> #include <cstring> #inc ...
- [bzoj2243][SDOI2011]染色
Description 给定一棵有$n$个节点的无根树和$m$个操作,操作有$2$类: 1.将节点$a$到节点$b$路径上所有点都染成颜色$c$; 2.询问节点$a$到节点$b$路径上的颜色段数量(连 ...
- bzoj2243 sdoi2011 染色 paint
明明是裸树剖 竟然调了这么久好蛋疼 大概是自己比较水的原因吧 顺便+fastio来gangbang #include<iostream> #include<cstring> # ...
- BZOJ2243[SDOI2011]染色——树链剖分+线段树
题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221 ...
- [BZOJ2243][SDOI2011]染色 解题报告|树链剖分
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“ ...
随机推荐
- JAVA中的数组对象
代码:Student [] sd=new Student[5];//新建一个学生类的数组对象sd. sd[0]=new Student("kj",13);//为数组对 ...
- 69. Sqrt(x) (Divide-and-Conquer)
Implement int sqrt(int x). Compute and return the square root of x. 注意: 计算平方的时候可能会溢出,所以mid要定义为long 另 ...
- archives of source
"ubuntu 暂时不能解析域名 archive.ubuntu.com"怎么办? root下输入命令:lsb_release -a用来查询Ubuntu版本号 登录网站 http:/ ...
- extends前提
extends之前需要先include
- EXTI—外部中断事件控制器
外部中断概述 STM32F4的每个IO都可以作为外部中断输入. STM32F4的中断控制器支持22个外部中断/事件请求: 从上面可以看出,STM32F4供IO使用的中断线只有16个,但是STM32F4 ...
- 实践作业4:Web测试实践(小组作业)每日任务记录1
会议时间:2017年12月21日会议地点:东九教学楼自习区主 持 人:王晨懿参会人员:王晨懿.余晨晨.郑锦波.杨潇.侯欢.汪元记 录 人:王晨懿会议议题:小组作业熟悉和任务分配 (一)选择待测产品 我 ...
- Smarty的条件判断语句
(1)基本句式{if $name eq "Fred"}Welcome Sir.{elseif $name eq "Wilma"}Welcome Ma'am.{e ...
- mysql 用户创建,修改和忘记root密码的操作
#创建用户CREATE USER 'zzq'@'localhost' IDENTIFIED by 'zzq';#flush privileges 命令本质上的作用是将当前user和privilige表 ...
- .NET开源MSSQL、Redis监控产品Opserver之MSSQL配置
MSSQL的配置比较简单,主要包括三部分: 默认配置(defaultConnectionString).集群配置(clusters).单实例配置(instances) defaultConnectio ...
- [GO]方法值和方法表达式
package main import "fmt" type Person struct { name string sex byte age int } func (p Pers ...