题解:

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

记录两端点的颜色,做到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. 1-5SpringBoot操作之Spring-Data-Jpa(二)CRUD实现

    本帖来演示下SpringBoot下,实用Spring-Data-Jpa来实现CRUD操作,视图层采用Freemarker 这里我们先把application.properties修改成applicat ...

  2. qrcode在手机上不显示的问题

    可以试试以下解决方案: 1.修改qrcode.min.js:里的function n()红线区域替换成这个 , 原因是这样子才能支持安卓机显示.

  3. 创建Git本地仓库

    一.获取Git仓库 安装好Git后即可创建Git本地仓库,开始项目的版本管理.有两种方法取得Git项目仓库:1.在现有项目或目录下导入所有文件到Git中:2.从一个服务器克隆一个现有的Git仓库. 1 ...

  4. Emergency

    题意:有N个点,M条边,每个点有权值,问从起点到终点最短路的个数以及权值最大的最短路的权值. 分析:修改Dijstra模板. #include<bits/stdc++.h> using n ...

  5. InnoDB 和 MyISAM的索引区别

    MyISAM索引实现 MyISAM索引文件和数据文件是分离的,索引文件的data域保存记录所在页的地址(物理存储位置),通过这些地址来读取页,进而读取被索引的行数据. MyISAM的索引原理图如下,C ...

  6. VUE - 路由跳转时设置动画效果

    /* 为对应的路由跳转时设置动画效果 */   <transition name="fade">         <router-view />     & ...

  7. SpringAOP源码跟踪及学习

    Spring 版本 4.3.2 在拿到 Bean 实例以后,会经历一系列的初始化工作,如:工厂回调.init 方法.后处理器在 Bean 初始化前后的处理等,在一般情况下(非 factory-meth ...

  8. 数据交互与ajax

    在Long Long Ago,那个前端还是一个切图仔的年代,那时的页面根本没有js,前端的api非常的少,页面的所有数据都来自服务器渲染,任何的页面操作都会提交form表单请求刷新页面,直到那一天,浏 ...

  9. Day4 - K - Ant Trip HDU - 3018

    Ant Country consist of N towns.There are M roads connecting the towns. Ant Tony,together with his fr ...

  10. 004.Oracle数据库 , 查询多字段连接合并

    /*Oracle数据库查询日期在两者之间*/ SELECT PKID , OCCUR_DATE, PKID || TO_CHAR( OCCUR_DATE, ' yyyy/mm/dd hh24:mi:s ...