线段树区间修改和点修改 hdoj 1698(区间修改)、hdoj 1754(点修改)

举报
xindoo 发表于 2022/04/16 01:55:10 2022/04/16
【摘要】         这两题我都在之前做过,但并未通过,那次做的时候是刚开始接触线段树,现在有了一点点的了解,翻出以前的代码稍作修改就AC了。之前1698错误的原因是没有注意到位运算的优先级。 //hdoj 1698#include<stdio.h>#include<string...


  
  1. //hdoj 1698
  2. #include<stdio.h>
  3. #include<string.h>
  4. #define maxn 100010
  5. struct node
  6. {
  7. int l;
  8. int r;
  9. int mid;
  10. int val;
  11. }tree[maxn<<2];
  12. void buildtree(int o,int l,int r)
  13. {
  14. tree[o].val = 1;
  15. tree[o].l = l;
  16. tree[o].r = r;
  17. tree[o].mid = (l + r)>>1;
  18. if(l == r)
  19. return ;
  20. else
  21. {
  22. buildtree(o<<1, l, tree[o].mid);
  23. buildtree((o<<1)+1, tree[o].mid + 1, r);
  24. }
  25. }
  26. void update(int o, int l, int r, int val)
  27. {
  28. if(l == tree[o].l && r == tree[o].r)
  29. {
  30. tree[o].val = val;
  31. return ;
  32. }
  33. //递归边界,如果更新的边界和节点边界相同则返回
  34. if(tree[o].val != 0)
  35. {
  36. tree[o<<1].val = tree[o].val;
  37. tree[(o<<1)+1].val = tree[o].val;
  38. tree[o].val = 0;
  39. }
  40. //这个地方是为了表示tree[o]的两个节点的val值是不一样的
  41. //要更新的段无非三种情况,要么在l-mid段,要么在mid-r段,再么就是两端都存在的,分情况递归
  42. if(r <= tree[o].mid)
  43. update(o<<1, l, r, val);
  44. //这个是位于l-mid段的
  45. else if(l > tree[o].mid)
  46. update((o<<1)+1, l, r, val);
  47. //这个是位于mid-r段的
  48. else
  49. {
  50. update(o<<1, l, tree[o].mid, val);
  51. update((o<<1)+1, tree[o].mid + 1, r, val);
  52. }
  53. //两段都有的情况
  54. }
  55. int getsum(int o,int l,int r)
  56. {
  57. if(tree[o].val > 0)
  58. return tree[o].val * (tree[o].r - tree[o].l + 1);
  59. //tree[o].val > 0 证明在tree[o].l到tree[o].r区间里面的val都是一样的,要获取的区间也属于该区间
  60. if(r <= tree[o].mid)
  61. return getsum(o * 2, l, r);
  62. //同 update() 也是分三种情况
  63. else if (l > tree[o].mid)
  64. return getsum((o<<1)+1, l, r);
  65. else
  66. return getsum(o<<1, l, tree[o].mid) + getsum((o<<1)+1, tree[o].mid, r);
  67. }
  68. int main()
  69. {
  70. int t, n, i, j, op, x, y, z;
  71. scanf("%d",&t);
  72. for(i = 1;i <= t;i++)
  73. {
  74. scanf("%d",&n);
  75. buildtree(1, 1, n);
  76. scanf("%d",&op);
  77. while(op--)
  78. {
  79. scanf("%d%d%d",&x,&y,&z);
  80. update(1, x, y, z);
  81. }
  82. int ans = getsum(1,1,n);
  83. printf("Case %d: The total value of the hook is %d.\n",i,ans);
  84. }
  85. return 0;
  86. }


  
  1. //hdoj 1754
  2. #include<stdio.h>
  3. #include<string.h>
  4. #define maxn 200005
  5. struct node
  6. {
  7. int l;
  8. int r;
  9. int mid;
  10. int max;
  11. }tree[maxn<<2];
  12. int arr[maxn];
  13. int max(int a,int b)
  14. {
  15. return a > b ? a : b;
  16. }
  17. void build(int o, int l, int r)
  18. {
  19. tree[o].l = l;
  20. tree[o].r = r;
  21. tree[o].mid = (l + r)>>1;
  22. if(l == r)
  23. {
  24. tree[o].max = arr[l];
  25. return ;
  26. }
  27. build(o<<1, l, tree[o].mid);
  28. build((o<<1)+1, tree[o].mid + 1, r);
  29. tree[o].max = max(tree[o<<1].max, tree[(o<<1)+1].max);
  30. }
  31. void update(int o, int l, int r,int a, int val)
  32. {
  33. tree[o].max = max(tree[o].max, val);
  34. if(tree[o].l == tree[o].r)
  35. {
  36. return ;
  37. }
  38. if(a <= tree[o].mid)
  39. update(o<<1,l,tree[o].mid,a,val);
  40. else
  41. update((o<<1)+1, tree[o].mid + 1, r, a, val);
  42. }
  43. int query(int o,int l,int r)
  44. {
  45. if(l == tree[o].l && r == tree[o].r)
  46. return tree[o].max;
  47. if(r <= tree[o].mid)
  48. return query(o*2,l,r);
  49. if(l > tree[o].mid)
  50. return query((o<<1)+1, l, r);
  51. return max(query(o<<1, l, tree[o].mid),query((o<<1)+1, tree[o].mid+1, r));
  52. }
  53. int main()
  54. {
  55. int n, m, i, t, a, b;
  56. char c;
  57. while(scanf("%d%d",&n,&m) != EOF)
  58. {
  59. for(i = 1;i <= n;i++)
  60. {
  61. scanf("%d",&arr[i]);
  62. }
  63. build(1,1,n);
  64. while(m--)
  65. {
  66. getchar();
  67. scanf("%c%d%d",&c,&a,&b);
  68. if(c == 'U')
  69. update(1,1,n,a,b);
  70. else
  71. printf("%d\n",query(1,a,b));
  72. }
  73. }
  74. return 0;
  75. }


文章来源: xindoo.blog.csdn.net,作者:xindoo,版权归原作者所有,如需转载,请联系作者。

原文链接:xindoo.blog.csdn.net/article/details/8483014

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。