题意:在序列中修改单点和查询区间和

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define ls l,m,rt<<1
  5. #define rs m+1,r,rt<<1|1
  6. using namespace std;
  7. const int maxn=*;
  8. int sum[maxn<<],add[maxn<<];//sum求和,add懒惰标记
  9. int a[maxn]={},n=;//存原数组数据下标[1,n]
  10. //更新节点信息,这里是求和
  11. void pushup(int rt)
  12. {
  13. sum[rt]=sum[rt<<]+sum[rt<<|];
  14. }
  15. //建树
  16. void pushdown(int rt,int ln,int rn)
  17. {//ln,rn为左子树,右子树的数量
  18. if(add[rt])//下推标记
  19. {
  20. add[rt<<]+=add[rt];
  21. add[rt<<|]+=add[rt];
  22. sum[rt<<]+=add[rt]*ln;
  23. sum[rt<<|]+=add[rt]*rn;
  24. add[rt]=;//清除本节点标记
  25. }
  26. }
  27. void build(int l,int r,int rt)//rt表示当前节点编号
  28. {
  29. if(l==r)
  30. {
  31. sum[rt]=a[l];
  32. return;
  33. }
  34. int m=(l+r)>>;
  35. build(l,m,rt<<);
  36. build(m+,r,rt<<|);
  37. pushup(rt);
  38. }
  39.  
  40. //点修改a[L]+=c;
  41. //比如update(a,-b,1,n,1);//修改a点的值,减去b,当前节点区间是1到n,起始点是1
  42. void update(int L,int c,int l,int r,int rt)
  43. {//l,r当前节点区间,rt当前节点编号,L需要修改的节点,c修改的值
  44. if(l==r)
  45. {
  46. sum[rt]+=c;
  47. return;
  48. }
  49. int m=(l+r)>>;
  50. //根据条件判断调用左子树还是右子树
  51. if(L<=m)
  52. update(L,c,l,m,rt<<);
  53. else
  54. update(L,c,m+,r,rt<<|);
  55. pushup(rt);//子节点更新,所以本节点也需要更新
  56. }
  57.  
  58. //区间修改a[r,t]+=c
  59. ////比如query(a,b,1,n,1))查询a b之间的和,当前节点区间是1到n,起始点是1
  60. void update_(int L,int R,int c,int l,int r,int rt)
  61. {//L,R表示操作区间,l,r表示当前节点区间,rt表示当前节点编号
  62. if(L<=l&&r<=R)//遍历的区间在操作区间内
  63. {
  64. sum[rt]+=c*(r-l+);
  65. add[rt]+=c;
  66. return;
  67. }
  68. int m=(l+r)>>;
  69. pushdown(rt,m-l+,r-m);
  70. if(L<=m)
  71. update_(L,R,c,l,m,rt<<);
  72. if(R>m)
  73. update_(L,R,c,m+,r,rt<<|);
  74. pushup(rt);
  75. }
  76. //区间查询 a[l,r]的和
  77. //下推标记函数
  78.  
  79. int query(int L,int R,int l,int r,int rt)
  80. {
  81. if(L<=l&&r<=R)
  82. {
  83. return sum[rt];
  84. }
  85. int m=(l+r)>>;
  86. pushdown(rt,m-l+,r-m);
  87. int ans=;
  88. if(L<=m)
  89. ans+=query(L,R,l,m,rt<<);
  90. if(R>m)
  91. ans+=query(L,R,m+,r,rt<<|);
  92. return ans;
  93. }
  94.  
  95. int main()
  96. {
  97. int t,cnt=;
  98. scanf("%d",&t);
  99. while(t--)
  100. {
  101. memset(a,,sizeof(a));
  102. memset(sum,,sizeof(sum));
  103. memset(add,,sizeof(add));
  104. scanf("%d",&n);
  105. for(int i=;i<=n;i++)
  106. scanf("%d",&a[i]);
  107. build(,n,);
  108. printf("Case %d:\n",cnt++);
  109. char str[];
  110. while(scanf("%s",str)&&str[]!='E')
  111. {
  112. int a,b;
  113. scanf("%d%d",&a,&b);
  114. if(str[]=='Q')
  115. {
  116. query(a,b,,n,);
  117. }
  118. if(str[]=='S')
  119. update(a,-b,,n,);//修改a点的值,减去b,当前节点区间是1到n,起始点是1
  120. if(str[]=='A')
  121. update(a,b,,n,);
  122. if(str[]=='Q')
  123. printf("%d\n",query(a,b,,n,));//查询a b之间的和,当前节点区间是1到n,起始点是1
  124.  
  125. }
  126.  
  127. }
  128. return ;
  129. }

HDU1166 敌兵布阵 [线段树模板]的更多相关文章

  1. HDU-1166敌兵布阵(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...

  2. hdu1166 敌兵布阵(线段树 求区间和 更新点)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. hdu1166 敌兵布阵 线段树(区间更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. HDU1166 敌兵布阵(线段树)

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  5. 【生活没有希望】hdu1166敌兵布阵 线段树

    线段树水题刷刷,生活没有希望 最近看到代码跟树状数组差不多短的非递归线段树,常数也很小——zkw线段树 于是拿道水题练练手 短到让人身无可恋 ;pos;pos/=) a[pos]+=x;} ,ans= ...

  6. HDU1166 敌兵布阵 线段树详解

    题解: 更新是线段树的单点更新,简单一点. 有50000个阵营,40000查询,用普通数组肯定超时.区间求和和区间查询问题用线段树最好不过了. 先说说什么是线段树. 区间[1,10]用树的方法存起来, ...

  7. HDU1166 敌兵布阵 —— 线段树单点修改

    题目链接:https://vjudge.net/problem/HDU-1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布 ...

  8. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  9. hdu 1166 敌兵布阵 线段树 点更新

    // hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...

随机推荐

  1. PAT Advanced 1090 Highest Price in Supply Chain (25) [树的遍历]

    题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)–everyone inv ...

  2. Luogu P3031 高于中位数

    定义序列\(x_i = f([H_i >=x])\;\;\;\;其中f(0) = -1,f(1) = 1\),那么区间[i,j]满足条件当且仅当sum_j-sum_{i-1} > 0,即s ...

  3. vue图片查看器

    vue 安装图片查看器插件安装cnpm install v-viewer引用 import 'viewerjs/dist/viewer.css' import Viewer from 'v-viewe ...

  4. Express+MySQL实现图片上传到服务器并把路径保存到数据库中

    demo准备:mysql5.7.20 express4.0 处理图片文件的中间件Multer 先搭建服务器并展示html页面 const express = require("express ...

  5. jquery如何获取div下ul的某个li

    $('div ul').each(function(){ alert($(this).find('li').eq(x)) }) $("div ul li:eq(1)")// $(& ...

  6. py02_02:pyc的解释

    1. Python是一门解释型语言吗? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言 ...

  7. 神奇的Python代码

    一 def f(arg=i): print(arg) i = 6 f() i = 7 f(i) 输出结果是: 7 7

  8. sol - 0x60,61,62

    [例题]走廊泼水节 设当前扫描到边x,y,长度为z,x所处的并查集为Sx,y所处的并查集为Sy: 对于任意u属于Sx,v属于Sy,我们可以知道u,v之间必连一条边 但是我们要在保证x,y之间的边属于唯 ...

  9. matlab代码学习_2018-7-28

    1.核范数||A|| * 是指矩阵奇异值的和,英文称呼叫Nuclear Norm.matlab code:[s, u, v] = svd(A); nulear_norm = sum(diag(s)); ...

  10. Office文档WEB端在线浏览(转换成Html)

    最近在做了一个项目,要求是对Office文档在线预览.下面给大家分享一下我的方法. 1.第一种方法(不建议使用)我是在网上搜了一个利用COM组件对office文档进行转换,但是此方法必须要装Offic ...