poj 2777 Count Color【线段树段更新】

迈不过友情╰ 2022-08-10 17:53 97阅读 0赞

题目:poj 2777 Count Color

题意:给出一段1 * n 的栅栏,有两种操作,第一种:把 l — r 全部染成同一颜色t,第二种,查询 l—-r 一共有多少种颜色。

分类:线段树

分析:我们可以给每个节点加一个标记,标记当前节点是否只有一种颜色,然后对只有一种颜色的节点如果要染色的话,那么他会变成几种颜色的,这时候记得向下更新一次就好,统计的时候统计节点有单个颜色的颜色就好。

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. using namespace std;
  6. const int N = 110000;
  7. struct Node
  8. {
  9. int l,r;
  10. long long num;
  11. };
  12. Node tree[4*N];
  13. int vis[35];
  14. void build(int l,int r,int o)
  15. {
  16. tree[o].l=l;
  17. tree[o].r=r;
  18. tree[o].num=1;
  19. if(l==r)
  20. return ;
  21. int mid=(l+r)/2;
  22. build(l,mid,o*2);
  23. build(mid+1,r,o*2+1);
  24. }
  25. void update(int l,int r,int t,int o)
  26. {
  27. if(tree[o].l==l && tree[o].r==r)
  28. {
  29. tree[o].num=t;
  30. return;
  31. }
  32. if(tree[o].num==t) return;
  33. if(tree[o].num!=-1)
  34. {
  35. tree[2*o].num=tree[o].num;
  36. tree[2*o+1].num=tree[o].num;
  37. tree[o].num=-1;
  38. }
  39. int mid=(tree[o].l+tree[o].r)>>1;
  40. if(r<=mid)
  41. update(l,r,t,o+o);
  42. else if(l>mid)
  43. update(l,r,t,o+o+1);
  44. else
  45. {
  46. update(l,mid,t,o*2);
  47. update(mid+1,r,t,o*2+1);
  48. }
  49. }
  50. void query(int l,int r,int o)
  51. {
  52. if(tree[o].num!=-1)
  53. {
  54. vis[tree[o].num]=1;
  55. return ;
  56. }
  57. int mid=(tree[o].l+tree[o].r)>>1;
  58. if(r<=mid)
  59. query(l,r,o+o);
  60. else if(l>mid)
  61. query(l,r,o+o+1);
  62. else
  63. {
  64. query(l,mid,o*2);
  65. query(mid+1,r,o*2+1);
  66. }
  67. }
  68. int main()
  69. {
  70. int n,c,m;
  71. while(~scanf("%d%d%d",&n,&c,&m))
  72. {
  73. build(1,n,1);
  74. while(m--)
  75. {
  76. getchar();
  77. char ok;
  78. int x,y,z;
  79. scanf("%c",&ok);
  80. if(ok=='C')
  81. {
  82. scanf("%d%d%d",&x,&y,&z);
  83. update(x,y,z,1);
  84. }
  85. else
  86. {
  87. int ans=0;
  88. memset(vis,0,sizeof(vis));
  89. scanf("%d%d",&x,&y);
  90. query(x,y,1);
  91. for(int i=1;i<=30;i++)
  92. if(vis[i])
  93. ans++;
  94. printf("%d\n",ans);
  95. }
  96. }
  97. }
  98. return 0;
  99. }

发表评论

表情:
评论列表 (有 0 条评论,97人围观)

还没有评论,来说两句吧...

相关阅读