[BZOJ2243][SDOI2011]染色(树链剖分)
树链剖分就行了,注意线段树上颜色的合并
Code
#include <cstdio>
#include <algorithm>
#define N 100010
#define MID int mid=(l+r)>>1,ls=id<<1,rs=id<<1|1
#define len (r-l+1)
using namespace std; struct tree{
int lc,rc,sum,tag;
tree(){lc=rc=tag=-1;sum=0;}
friend tree operator +(tree a,tree b){
if(a.lc==-1) return b;
if(b.lc==-1) return a;
tree c;
c.lc=a.lc,c.rc=b.rc;
c.sum=a.sum+b.sum-(a.rc==b.lc?1:0);
return c;
}
}T[N*4];
struct info{int to,nex;}e[N*2];
int n,m,tot,head[N],cnt,A[N];
int tid[N],dep[N],son[N],fa[N],sz[N],tp[N],tw[N]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} inline void Link(int u,int v){
e[++tot].nex=head[u];head[u]=tot;e[tot].to=v;
} void dfs(int u,int pre){
sz[u]=1;
for(int i=head[u],mx=0;i;i=e[i].nex){
int v=e[i].to;
if(v==pre) continue;
fa[v]=u;
dep[v]=dep[u]+1;
dfs(v,u);
sz[u]+=sz[v];
if(sz[v]>mx){son[u]=v;mx=sz[v];}
}
} void dddfs(int u,int top){
tp[u]=top;
tid[u]=++cnt;
tw[cnt]=A[u];
if(!son[u]) return; dddfs(son[u],top);
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(v==fa[u]||v==son[u]) continue;
dddfs(v,v);
}
} void build(int l,int r,int id){
if(l==r){T[id].sum=1;T[id].lc=T[id].rc=tw[l];return;}
MID;
build(l,mid,ls);
build(mid+1,r,rs);
T[id]=T[ls]+T[rs];
} void Init(){
n=read(),m=read();
for(int i=1;i<=n;A[i++]=read());
for(int i=1;i<n;++i){
int u=read(),v=read();
Link(u,v),Link(v,u);
}
dfs(1,0);
dddfs(1,1);
build(1,n,1);
} inline void pushdown(int l,int r,int id){
int &tmp=T[id].tag;
if(tmp==-1) return;
MID;
T[ls].lc=T[ls].rc=T[rs].lc=T[rs].rc=tmp;
T[ls].sum=T[rs].sum=1;
T[ls].tag=T[rs].tag=tmp;
tmp=-1;
} int query(int l,int r,int id,int L,int R){
if(L<=l&&r<=R) return T[id].sum;
pushdown(l,r,id);
MID;
int res=0;
if(R<=mid) res+=query(l,mid,ls,L,R);
else if(L>mid) res+=query(mid+1,r,rs,L,R);
else res+=query(l,mid,ls,L,R),res+=query(mid+1,r,rs,L,R),res-=(T[ls].rc==T[rs].lc)?1:0;
return res;
} int qDot(int l,int r,int id,int x){
if(l==r&&l==x) return T[id].lc;
pushdown(l,r,id);
MID;
if(x<=mid) return qDot(l,mid,ls,x);
else return qDot(mid+1,r,rs,x);
} inline int qRange(int u,int v){
int res=0;
while(tp[u]!=tp[v]){
if(dep[tp[u]]<dep[tp[v]]) swap(u,v);
res+=query(1,n,1,tid[tp[u]],tid[u]);
int x=qDot(1,n,1,tid[tp[u]]),y=qDot(1,n,1,tid[fa[tp[u]]]);
if(x==y) --res;
u=fa[tp[u]];
}
if(dep[u]>dep[v]) swap(u,v);
res+=query(1,n,1,tid[u],tid[v]);
return res;
} void update(int l,int r,int id,int L,int R,int x){
if(L<=l&&r<=R){
T[id].sum=1;
T[id].lc=T[id].rc=T[id].tag=x;
return;
}
pushdown(l,r,id);
MID;
if(L<=mid) update(l,mid,ls,L,R,x);
if(R>mid) update(mid+1,r,rs,L,R,x);
T[id]=T[ls]+T[rs];
} void updRange(int u,int v,int x){
while(tp[u]!=tp[v]){
if(dep[tp[u]]<dep[tp[v]]) swap(u,v);
update(1,n,1,tid[tp[u]],tid[u],x);
u=fa[tp[u]];
}
if(dep[u]>dep[v]) swap(u,v);
update(1,n,1,tid[u],tid[v],x);
} inline void solve(){
char ch;
while(m--){
for(ch=getchar();ch!='C'&&ch!='Q';ch=getchar());
if(ch=='Q'){
int u=read(),v=read();
printf("%d\n",qRange(u,v));
}else{
int u=read(),v=read(),x=read();
updRange(u,v,x);
}
}
} int main(){Init();solve();}
[BZOJ2243][SDOI2011]染色(树链剖分)的更多相关文章
- bzoj2243[SDOI2011]染色 树链剖分+线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9012 Solved: 3375[Submit][Status ...
- BZOJ2243[SDOI2011]染色——树链剖分+线段树
题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221 ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- bzoj-2243 2243: [SDOI2011]染色(树链剖分)
题目链接: 2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6267 Solved: 2291 Descript ...
- BZOJ2243 洛谷2486 [SDOI2011]染色 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2243 题目传送门 - 洛谷2486 题意概括 一棵树,共n个节点. 让你支持以下两种操作,共m次操 ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
- Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5020 Solved: 1872[Submit][Status ...
- BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并
2243: [SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数 ...
- 2243: [SDOI2011]染色(树链剖分+线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 8400 Solved: 3150[Submit][Status ...
随机推荐
- Mysql慢查询 [第一篇]
一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态slow_q ...
- git 提交各种情况下的处理方式
自己总结: 01.若在提交过程中有冲突,解决冲突后,git add . git rebase —continue git push for 02.git rebase vs git merge g ...
- POS开发问题 - 多个弹出框的实现
业务场景如下图: 页面出现提示框: 点击确定,隐藏上面的弹出框, 继续弹出提示: 点击确定隐藏上面的弹出框,继续弹出下面提示: 点击确定隐藏上面的弹出框,继续弹出下面提示: 点击确定,跳转页面 ...
- Eclipse Action
Interface IAction package org.eclipse.jface.action; import org.eclipse.core.commands.IHandlerAttribu ...
- 图片延迟插件 Jquery.lazyload.min.js
当一个页面打开的图片太多,我们可以用jquery的一个延迟加载插件.名为:jquery.lazyload.min.js 使用非常简单,如下: <div style="height:70 ...
- C#设计模式--抽象工厂模式(创建型模式)
一.抽象工厂模式: 在工厂模式中具体的产品和具体的工厂是一一对应的,一个工厂只能生产一种产品,结构单一,例如小米公司刚开始是只生产小米手机,但是伴随着公司的发展,他们需要生产不同型号的手机,也会生产路 ...
- Centos 7.0_64bit 下安装 Zabbix server 3.0服务器的安装
一.关闭selinux 修改配置文件/ etc / selinux / config,将SELINU置为禁用(disabled) vim /etc/selinux/config # This ...
- 如何下载YouTube 8K视频
随着科技的进步,人们对高清视频的要求越来越高,因此视频的分辨率也越来越高.从最开始的720P,到1080P,再到2K,进而到如今4K,不断地满足人们挑剔的胃口.4K分辨率的视频已经逐渐进入人们的生活中 ...
- Installing xgboost and cmake, mingw64 and mingw
Problem: installing the xgboost to get the python package for later importing
- 近期流行的JavaScript框架与主题
[新年快乐]2017年你应该关注的JavaScript框架与主题 2017-01-01 王下邀月熊 JavaScript JavaScript的繁荣促生了很多优秀的技术.框架与工具库,这空前的繁荣也给 ...