[关闭]
@lawk97 2017-05-27T02:51:46.000000Z 字数 2598 阅读 822

寒假专题训练--线段树

线段树


地址

A - 敌兵布阵

[HDU - 1166]

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <map>
  7. using namespace std;
  8. int test;
  9. int n,kase;
  10. char order[10];
  11. struct tr{
  12. int l,r,v;
  13. }t[200005];
  14. void build(int k,int l,int r){
  15. t[k].l=l;
  16. t[k].r=r;
  17. t[k].v=0;
  18. if (l==r)
  19. {
  20. return;
  21. }
  22. int mid=l+(r-l)/2;
  23. build(k*2,l,mid);
  24. build(k*2+1,mid+1,r);
  25. }
  26. void add(int k,int now,int num){
  27. if (t[k].l==t[k].r)
  28. {
  29. t[k].v+=num;
  30. return;
  31. }
  32. int mid=t[k].l+(t[k].r-t[k].l)/2;
  33. if (now<=mid)
  34. {
  35. add(2*k,now,num);
  36. }else{
  37. add(2*k+1,now,num);
  38. }
  39. t[k].v=t[k*2].v+t[k*2+1].v;
  40. }
  41. int query(int k,int a,int b){
  42. if (t[k].l>=a&&t[k].r<=b)
  43. {
  44. return t[k].v;
  45. }
  46. if (a>t[k].r||b<t[k].l)
  47. {
  48. return 0;
  49. }
  50. int mid=t[k].l+(t[k].r-t[k].l)/2;
  51. if (a>mid)
  52. {
  53. return query(2*k+1,a,b);
  54. }else if(b<=mid){
  55. return query(2*k,a,b);
  56. }else{
  57. return query(2*k,a,mid)+query(2*k+1,mid+1,b);
  58. }
  59. }
  60. int main(){
  61. kase=0;
  62. scanf("%d",&test);
  63. while(test--){
  64. scanf("%d",&n);
  65. build(1,1,n);
  66. printf("Case %d:\n",++kase );
  67. for(int i=1;i<=n;i++){
  68. int num;
  69. scanf("%d",&num);
  70. add(1,i,num);
  71. }
  72. while(scanf("%s",order),order[0]!='E'){
  73. int a,b;
  74. scanf("%d%d",&a,&b);
  75. if(order[0]=='A'){
  76. add(1,a,b);
  77. }else if(order[0]=='S'){
  78. add(1,a,-b);
  79. }else{
  80. printf("%d\n",query(1,a,b));
  81. }
  82. }
  83. }
  84. }

B - Color the ball

[HDU - 1556]

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注