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,表示xy之间有一条无向边。

下面 行每行描述一个操作:

“C a b c”表示这是一个染色操作,把节点a到节点b路径上所有点(包括a和b)都染成颜色c;

“Q a b”表示这是一个询问操作,询问节点a到节点b(包括a和b)路径上的颜色段数量。

Output

对于每个询问操作,输出一行答案。

Sample Input

6 5

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

3

1

2

HINT

数N<=10^5,操作数M<=10^5,所有的颜色C为整数且在[0, 10^9]之间。

  1. #include<cstdio>
  2. #include<iostream>
  3. #define N 100010
  4. using namespace std;
  5. 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;
  6. struct node{
  7. int to,pre;
  8. };node e[N*];
  9. void add(int i,int x,int y){
  10. e[i].to=y;
  11. e[i].pre=head[x];
  12. head[x]=i;
  13. }
  14. void dfs1(int x){
  15. son[x]=;
  16. for(int i=head[x];i;i=e[i].pre){
  17. int v=e[i].to;
  18. if(fa[x]==v) continue;
  19. fa[v]=x;dep[v]=dep[x]+;
  20. dfs1(v);
  21. son[x]+=son[v];
  22. }
  23. }
  24. void dfs2(int x,int chain){
  25. ++sz;pos[x]=sz;top[x]=chain;int k=,maxn=;
  26. for(int i=head[x];i;i=e[i].pre)
  27. if(fa[x]!=e[i].to&&son[e[i].to]>maxn){
  28. k=e[i].to;maxn=son[e[i].to];
  29. }
  30. if(!k) return;
  31. dfs2(k,chain);
  32. for(int i=head[x];i;i=e[i].pre)
  33. if(fa[x]!=e[i].to&&e[i].to!=k)
  34. dfs2(e[i].to,e[i].to);
  35. }
  36. void pushup(int k){
  37. lco[k]=lco[k*];rco[k]=rco[k*+];
  38. sum[k]=sum[k*]+sum[k*+];
  39. if(rco[k*]==lco[k*+])sum[k]--;
  40. }
  41. void pushdown(int k){
  42. if(!tag[k]) return;
  43. tag[k*]=tag[k*+]=tag[k];
  44. lco[k*]=lco[k*+]=tag[k];
  45. rco[k*]=rco[k*+]=tag[k];
  46. sum[k*]=sum[k*+]=;
  47. tag[k]=;
  48. }
  49. void change(int l,int r,int k,int x,int y,int v){
  50. if(l>=x&&r<=y){
  51. tag[k]=lco[k]=rco[k]=v;
  52. sum[k]=;
  53. return;
  54. }
  55. pushdown(k);
  56. int mid=l+r>>;
  57. if(x<=mid) change(l,mid,k*,x,y,v);
  58. if(y>mid) change(mid+,r,k*+,x,y,v);
  59. pushup(k);
  60. }
  61. int query(int l,int r,int k,int x,int y){
  62. if(l==x&&r==y)return sum[k];
  63. pushdown(k);
  64. int mid=l+r>>;
  65. if(y<=mid) return query(l,mid,k*,x,y);
  66. else if(x>mid) return query(mid+,r,k*+,x,y);
  67. else {
  68. int ans=query(l,mid,k*,x,mid)+query(mid+,r,k*+,mid+,y);
  69. if(rco[k*]==lco[k*+]) ans--;
  70. return ans;
  71. }
  72. }
  73. int find(int l,int r,int k,int x){
  74. if(l==r)return lco[k];
  75. pushdown(k);
  76. int mid=l+r>>;
  77. if(x<=mid) return find(l,mid,k*,x);
  78. else return find(mid+,r,k*+,x);
  79. }
  80. void xiugai(int x,int y,int v){
  81. while(top[x]!=top[y]){
  82. if(dep[top[x]]<dep[top[y]])swap(x,y);
  83. change(,n,,pos[top[x]],pos[x],v);
  84. x=fa[top[x]];
  85. }
  86. if(dep[x]>dep[y]) swap(x,y);
  87. change(,n,,pos[x],pos[y],v);
  88. }
  89. int qiuhe(int x,int y){
  90. int ans=;
  91. while(top[x]!=top[y]){
  92. if(dep[top[x]]<dep[top[y]])swap(x,y);
  93. ans+=query(,n,,pos[top[x]],pos[x]);
  94. if(find(,n,,pos[fa[top[x]]])==find(,n,,pos[top[x]])) ans--;
  95. x=fa[top[x]];
  96. }
  97. if(dep[x]>dep[y]) swap(x,y);
  98. ans+=query(,n,,pos[x],pos[y]);
  99. return ans;
  100. }
  101. int main(){
  102. freopen("jh.in","r",stdin);
  103. scanf("%d%d",&n,&m);
  104. for(int i=;i<=n;i++)scanf("%d",&a[i]);
  105. for(int i=;i<n;i++){
  106. int x,y;scanf("%d%d",&x,&y);
  107. add(i*-,x,y);add(i*,y,x);
  108. }
  109. dfs1();dfs2(,);
  110. for(int i=;i<=n;i++)change(,n,,pos[i],pos[i],a[i]);
  111. char opt[];
  112. for(int i=;i<=m;i++){
  113. int x,y,v;
  114. scanf("%s%d%d",opt,&x,&y);
  115. if(opt[]=='C'){
  116. scanf("%d",&v);
  117. xiugai(x,y,v);
  118. }
  119. else printf("%d\n",qiuhe(x,y));
  120. }
  121. return ;
  122. }

染色(bzoj 2243)的更多相关文章

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

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

  2. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  3. BZOJ 2243 染色(树链剖分好题)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 7971  Solved: 2990 [Submit][Stat ...

  4. [BZOJ 2243] [SDOI 2011] 染色 【树链剖分】

    题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————— ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. X11/extensions/XShm.h: No such file or directory

    CentOS 编译一些开源项目提示:X11/extensions/XShm.h: No such file or directory. 运行命令:yum install libXext-devel就可 ...

  2. 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].[/]       : ...

  3. ios项目icon和default图片命名规则

    一.应用图片标准iOS控件里的图片资源,苹果已经做了相应的升级,我们需要操心的是应用自己的图片资源.就像当初为了支持iPhone 4而制作的@2x高分辨率版本(译者:以下简称高分)图片一样,我们要为i ...

  4. 优化SQL语句的方法

    首先,对于where语句的注意事项: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where nu ...

  5. 判断一个链表是否为回文结构 【题目】 给定一个链表的头节点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 ...

  6. ios之NSURLRequest&NSURLConnection

    网络编程中一般都是经过  请求--->连接--->响应   (request  -->  connection  -->  response)这个过程. 一般的步骤是这样的: ...

  7. 洛谷 P2872 道路建设

    https://www.luogu.org/problemnew/show/P2872 算是比较裸的并查集了,已经有路的两个点之间建一条代价为0的边,路径长度计算两点之间的距离,做并查集就好咯. #i ...

  8. (41)zabbix监控api接口性能及可用性 天气预报api为例

    现在各种应用都走api,例如淘宝,天气预报等手机.pad客户端都是走api的,那么平时也得对这些api做监控了.怎么做呢?zabbix的web监控是不二选择了.今天就以天气预报api作为一个例子. 天 ...

  9. Linux基础学习-使用DHCP动态管理主机地址

    动态主机配置协议 部署dhcpd服务程序 参数 作用 ddns-update-style none; 设置DNS服务不自动进行动态更新 ignore client-updates; 忽略客户端更新DN ...

  10. Python9-模块2-包的进阶-day21

    包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉: ...