染色(bzoj 2243)
Description
给定一棵有n个节点的无根树和m个操作,操作有2类:
1、将节点a到节点b路径上所有点都染成颜色c;
2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。
请你写一个程序依次完成这m个操作。
Input
第一行包含2个整数n和m,分别表示节点数和操作数;
第二行包含n个正整数表示n个节点的初始颜色
下面 行每行包含两个整数x和y,表示x和y之间有一条无向边。
下面 行每行描述一个操作:
“C a b c”表示这是一个染色操作,把节点a到节点b路径上所有点(包括a和b)都染成颜色c;
“Q a b”表示这是一个询问操作,询问节点a到节点b(包括a和b)路径上的颜色段数量。
Output
对于每个询问操作,输出一行答案。
Sample Input
2 2 1 2 1 1
1 2
1 3
2 4
2 5
2 6
Q 3 5
C 2 1 1
Q 3 5
C 5 1 2
Q 3 5
Sample Output
1
2
HINT
数N<=10^5,操作数M<=10^5,所有的颜色C为整数且在[0, 10^9]之间。
- #include<cstdio>
- #include<iostream>
- #define N 100010
- using namespace std;
- int a[N],head[N],fa[N],son[N],dep[N],pos[N],top[N],lco[N*],rco[N*],sum[N*],tag[N*],n,m,sz;
- struct node{
- int to,pre;
- };node e[N*];
- void add(int i,int x,int y){
- e[i].to=y;
- e[i].pre=head[x];
- head[x]=i;
- }
- void dfs1(int x){
- son[x]=;
- for(int i=head[x];i;i=e[i].pre){
- int v=e[i].to;
- if(fa[x]==v) continue;
- fa[v]=x;dep[v]=dep[x]+;
- dfs1(v);
- son[x]+=son[v];
- }
- }
- void dfs2(int x,int chain){
- ++sz;pos[x]=sz;top[x]=chain;int k=,maxn=;
- for(int i=head[x];i;i=e[i].pre)
- if(fa[x]!=e[i].to&&son[e[i].to]>maxn){
- k=e[i].to;maxn=son[e[i].to];
- }
- if(!k) return;
- dfs2(k,chain);
- for(int i=head[x];i;i=e[i].pre)
- if(fa[x]!=e[i].to&&e[i].to!=k)
- dfs2(e[i].to,e[i].to);
- }
- void pushup(int k){
- lco[k]=lco[k*];rco[k]=rco[k*+];
- sum[k]=sum[k*]+sum[k*+];
- if(rco[k*]==lco[k*+])sum[k]--;
- }
- void pushdown(int k){
- if(!tag[k]) return;
- tag[k*]=tag[k*+]=tag[k];
- lco[k*]=lco[k*+]=tag[k];
- rco[k*]=rco[k*+]=tag[k];
- sum[k*]=sum[k*+]=;
- tag[k]=;
- }
- void change(int l,int r,int k,int x,int y,int v){
- if(l>=x&&r<=y){
- tag[k]=lco[k]=rco[k]=v;
- sum[k]=;
- return;
- }
- pushdown(k);
- int mid=l+r>>;
- if(x<=mid) change(l,mid,k*,x,y,v);
- if(y>mid) change(mid+,r,k*+,x,y,v);
- pushup(k);
- }
- int query(int l,int r,int k,int x,int y){
- if(l==x&&r==y)return sum[k];
- pushdown(k);
- int mid=l+r>>;
- if(y<=mid) return query(l,mid,k*,x,y);
- else if(x>mid) return query(mid+,r,k*+,x,y);
- else {
- int ans=query(l,mid,k*,x,mid)+query(mid+,r,k*+,mid+,y);
- if(rco[k*]==lco[k*+]) ans--;
- return ans;
- }
- }
- int find(int l,int r,int k,int x){
- if(l==r)return lco[k];
- pushdown(k);
- int mid=l+r>>;
- if(x<=mid) return find(l,mid,k*,x);
- else return find(mid+,r,k*+,x);
- }
- void xiugai(int x,int y,int v){
- while(top[x]!=top[y]){
- if(dep[top[x]]<dep[top[y]])swap(x,y);
- change(,n,,pos[top[x]],pos[x],v);
- x=fa[top[x]];
- }
- if(dep[x]>dep[y]) swap(x,y);
- change(,n,,pos[x],pos[y],v);
- }
- int qiuhe(int x,int y){
- int ans=;
- while(top[x]!=top[y]){
- if(dep[top[x]]<dep[top[y]])swap(x,y);
- ans+=query(,n,,pos[top[x]],pos[x]);
- if(find(,n,,pos[fa[top[x]]])==find(,n,,pos[top[x]])) ans--;
- x=fa[top[x]];
- }
- if(dep[x]>dep[y]) swap(x,y);
- ans+=query(,n,,pos[x],pos[y]);
- return ans;
- }
- int main(){
- freopen("jh.in","r",stdin);
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)scanf("%d",&a[i]);
- for(int i=;i<n;i++){
- int x,y;scanf("%d%d",&x,&y);
- add(i*-,x,y);add(i*,y,x);
- }
- dfs1();dfs2(,);
- for(int i=;i<=n;i++)change(,n,,pos[i],pos[i],a[i]);
- char opt[];
- for(int i=;i<=m;i++){
- int x,y,v;
- scanf("%s%d%d",opt,&x,&y);
- if(opt[]=='C'){
- scanf("%d",&v);
- xiugai(x,y,v);
- }
- else printf("%d\n",qiuhe(x,y));
- }
- return ;
- }
染色(bzoj 2243)的更多相关文章
- 洛谷 P2486 [SDOI2011]染色/bzoj 2243: [SDOI2011]染色 解题报告
[SDOI2011]染色 题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同 ...
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- BZOJ 2243 染色(树链剖分好题)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 7971 Solved: 2990 [Submit][Stat ...
- [BZOJ 2243] [SDOI 2011] 染色 【树链剖分】
题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————— ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
- Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5020 Solved: 1872[Submit][Status ...
- bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 7925 Solved: 2975[Submit][Status ...
- bzoj 2243: [SDOI2011]染色 (树链剖分+线段树 区间合并)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9854 Solved: 3725[Submit][Status ...
- BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
随机推荐
- X11/extensions/XShm.h: No such file or directory
CentOS 编译一些开源项目提示:X11/extensions/XShm.h: No such file or directory. 运行命令:yum install libXext-devel就可 ...
- EL1008E: Property or field 'timestamp' cannot be found on object of type 'java.util.HashMap
2018-06-22 09:50:19.488 INFO 20096 --- [nio-8081-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : ...
- ios项目icon和default图片命名规则
一.应用图片标准iOS控件里的图片资源,苹果已经做了相应的升级,我们需要操心的是应用自己的图片资源.就像当初为了支持iPhone 4而制作的@2x高分辨率版本(译者:以下简称高分)图片一样,我们要为i ...
- 优化SQL语句的方法
首先,对于where语句的注意事项: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where nu ...
- 判断一个链表是否为回文结构 【题目】 给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。 进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。
方式1:借助栈 空间辅助度是O(N) 方式2: 借助栈 空间复杂度是 O(n/2).只存后半个链表 方式3: 反转后半个链表 最后再反转回来 package my_basic.class_3; im ...
- ios之NSURLRequest&NSURLConnection
网络编程中一般都是经过 请求--->连接--->响应 (request --> connection --> response)这个过程. 一般的步骤是这样的: ...
- 洛谷 P2872 道路建设
https://www.luogu.org/problemnew/show/P2872 算是比较裸的并查集了,已经有路的两个点之间建一条代价为0的边,路径长度计算两点之间的距离,做并查集就好咯. #i ...
- (41)zabbix监控api接口性能及可用性 天气预报api为例
现在各种应用都走api,例如淘宝,天气预报等手机.pad客户端都是走api的,那么平时也得对这些api做监控了.怎么做呢?zabbix的web监控是不二选择了.今天就以天气预报api作为一个例子. 天 ...
- Linux基础学习-使用DHCP动态管理主机地址
动态主机配置协议 部署dhcpd服务程序 参数 作用 ddns-update-style none; 设置DNS服务不自动进行动态更新 ignore client-updates; 忽略客户端更新DN ...
- Python9-模块2-包的进阶-day21
包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉: ...