题解:

树剖,线段树维护区间颜色段数

记录两端点的颜色,做到O(1)合并

问题:

  非递归建树实现

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=; int n,m;
int incolor[maxn]; int cntedge;
int head[maxn];
int to[maxn<<],nex[maxn<<];
int addedge(int x,int y){
nex[++cntedge]=head[x];
to[cntedge]=y;
head[x]=cntedge;
} int father[maxn],depth[maxn],siz[maxn];
int heavyson[maxn],top[maxn],idx[maxn],ref[maxn]; int dfs1(int now,int fa){
father[now]=fa;
depth[now]=depth[fa]+;
siz[now]=;
for(int i=head[now];i;i=nex[i]){
if(to[i]==fa)continue;
dfs1(to[i],now);
siz[now]+=siz[to[i]];
if(siz[to[i]]>siz[heavyson[now]]){
heavyson[now]=to[i];
}
}
}
int temp;
int dfs2(int now,int toppoint){
top[now]=toppoint;
idx[now]=(++temp);
ref[temp]=now;
if(!heavyson[now])return ;
dfs2(heavyson[now],toppoint);
for(int i=head[now];i;i=nex[i]){
if(to[i]==father[now])continue;
if(to[i]==heavyson[now])continue;
dfs2(to[i],to[i]);
}
} struct SegmentTree{
int l,r;
int lcolor,rcolor;
int setcolor,sum;
}tree[maxn<<];
int pushup(int now){
tree[now].lcolor=tree[now<<].lcolor;
tree[now].rcolor=tree[now<<|].rcolor;
if(tree[now<<].rcolor==tree[now<<|].lcolor){
tree[now].sum=tree[now<<].sum+tree[now<<|].sum-;
}else{
tree[now].sum=tree[now<<].sum+tree[now<<|].sum;
}
}
int pushdown(int now){
if(tree[now].setcolor!=-){
tree[now<<].setcolor=tree[now<<].lcolor=tree[now<<].rcolor=tree[now].setcolor;
tree[now<<|].setcolor=tree[now<<|].lcolor=tree[now<<|].rcolor=tree[now].setcolor;
tree[now<<].sum=tree[now<<|].sum=;
tree[now].setcolor=-;
}
} int Build(int now,int l,int r){
tree[now].l=l;tree[now].r=r;
tree[now].setcolor=-;
if(l==r){
tree[now].lcolor=tree[now].rcolor=incolor[ref[l]];
tree[now].sum=;
return ;
}
int mid=(l+r)>>;
Build(now<<,l,mid);
Build(now<<|,mid+,r);
pushup(now);
} int Updata(int now,int ll,int rr,int x){
if(tree[now].l>=ll&&tree[now].r<=rr){
tree[now].setcolor=tree[now].lcolor=tree[now].rcolor=x;
tree[now].sum=;
return ;
}
int mid=(tree[now].l+tree[now].r)>>;
pushdown(now);
if(ll<=mid)Updata(now<<,ll,rr,x);
if(rr>mid)Updata(now<<|,ll,rr,x);
pushup(now);
} int Querysum(int now,int ll,int rr){
if(tree[now].l>=ll&&tree[now].r<=rr){
return tree[now].sum;
}
int mid=(tree[now].l+tree[now].r)>>;
pushdown(now);
if(rr<=mid)return Querysum(now<<,ll,rr);
else if(ll>mid)return Querysum(now<<|,ll,rr);
else if(tree[now<<].rcolor==tree[now<<|].lcolor)return Querysum(now<<,ll,rr)+Querysum(now<<|,ll,rr)-;
else return Querysum(now<<,ll,rr)+Querysum(now<<|,ll,rr);
} int Querycolor(int now,int p){
if(tree[now].l==tree[now].r){
return tree[now].lcolor;
}
int mid=(tree[now].l+tree[now].r)>>;
pushdown(now);
if(p<=mid)return Querycolor(now<<,p);
else return Querycolor(now<<|,p);
} int Change(int u,int v,int x){
int tu=top[u];
int tv=top[v];
while(tu!=tv){
if(depth[tu]<depth[tv]){
swap(tu,tv);swap(u,v);
}
Updata(,idx[tu],idx[u],x);
u=father[tu];tu=top[u];
}
if(depth[u]>depth[v])swap(u,v);
Updata(,idx[u],idx[v],x);
} int Getans(int u,int v){
int ret=;
int tu=top[u];
int tv=top[v];
while(tu!=tv){
if(depth[tu]<depth[tv]){
swap(tu,tv);swap(u,v);
}
ret=ret+Querysum(,idx[tu],idx[u]);
u=father[tu];
if(Querycolor(,idx[u])==Querycolor(,idx[tu]))--ret;
tu=top[u];
}
if(depth[u]>depth[v])swap(u,v);
ret=ret+Querysum(,idx[u],idx[v]);
return ret;
} int minit(){
temp=cntedge=;
memset(heavyson,,sizeof(heavyson));
memset(head,,sizeof(head));
} int main(){
scanf("%d%d",&n,&m);
minit(); for(int i=;i<=n;++i)scanf("%d",&incolor[i]);
for(int i=;i<=n-;++i){
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);addedge(y,x);
}
dfs1(,);
dfs2(,);
Build(,,n); char opty[];
while(m--){
int x,y,z;
scanf("%s",opty);
if(opty[]=='C'){
scanf("%d%d%d",&x,&y,&z);
Change(x,y,z);
}else{
scanf("%d%d",&x,&y);
printf("%d\n",Getans(x,y));
}
}
return ;
}

BZOJ:2243: [SDOI2011]染色的更多相关文章

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

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

  2. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

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

  3. Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树

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

  4. bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分

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

  5. bzoj 2243: [SDOI2011]染色 (树链剖分+线段树 区间合并)

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

  6. BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  7. BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并

    2243: [SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数 ...

  8. bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)

    [bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...

  9. 洛谷 P2486 [SDOI2011]染色/bzoj 2243: [SDOI2011]染色 解题报告

    [SDOI2011]染色 题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同 ...

  10. BZOJ 2243 [SDOI2011]染色 (树链剖分)(线段树区间修改)

    [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6870  Solved: 2546[Submit][Status][Disc ...

随机推荐

  1. Day10 - A - Rescue the Princess ZOJ - 4097

    Princess Cjb is caught by Heltion again! Her knights Little Sub and Little Potato are going to Helti ...

  2. shell-Startup-Files

    shell-Startup-Files 1. 相关阅读 2. 主流shell 3. shell实例类型 4. Shell启动文件的必要元素 4.1 路径: 命令路径, 4.2 提示符 5. 主流she ...

  3. R 《回归分析与线性统计模型》page164 单变量、多变量多项式模型

    --多项式回归模型 --单变量多项式模型 --多变量多项式模型 rm(list = ls()) library(openxlsx) library(leaps) #单变量多项式模型# data = r ...

  4. 004.Delphi插件之QPlugins,参数传递

    界面如下 插件框架中大量使用了接口的东西,看的眼花缭乱,很多地方只做了申明,具体的实现是在另外的子类. DLL的代码如下 unit ParamTest; interface uses classes, ...

  5. 0101-ioc

    背景 ioc是spring的基础,即控制反转.springboot基于注解使用ioc. ioc spring称所有被管理的对象为bean, spring ioc主要通过描述的方式完成3类bean的管理 ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-music

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-info-sign

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. Golang的运算符-位运算符

    Golang的运算符-位运算符 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位运算符概述 常见的位逻辑运算符: &: 位与运算符,表示AND(表示所有条件都得匹配), ...

  9. P1011 A+B 和 C

    转跳点:

  10. 微服务中springboot启动问题

    log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardS ...