A Simple Problem with Integers

You have N integers, A1A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of AaAa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

  1. 10 5
  2. 1 2 3 4 5 6 7 8 9 10
  3. Q 4 4
  4. Q 1 10
  5. Q 2 4
  6. C 3 6 3
  7. Q 2 4

Sample Output

  1. 4
  2. 55
  3. 9
  4. 15

Hint

The sums may exceed the range of 32-bit integers。
 
还是简单的线段树。
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<cstring>
  6. const int MAXN=;
  7. char s[],c;
  8. long long tree[MAXN*]={},add[MAXN*]={};
  9. int t,num,x,n,y,m,z,a[MAXN]={};
  10. using namespace std;
  11. void build(int l,int r,int p){
  12. if (l==r) tree[p]=a[l];
  13. else {
  14. int mid=(l+r)>>;
  15. build(l,mid,p*);
  16. build(mid+,r,p*+);
  17. tree[p]=tree[p*]+tree[p*+];
  18. }
  19. }
  20. long long query(int l,int r,int p,int x,int y){
  21. if (l==x&&r==y) return tree[p]+add[p]*(r-l+);
  22. else {
  23. add[p*+]+=add[p];
  24. add[p*]+=add[p];
  25. tree[p]+=add[p]*(r-l+);
  26. add[p]=;
  27. int mid=(l+r)>>;
  28. if (y<=mid) return query(l,mid,p*,x,y);
  29. else if(x>=mid+) return query(mid+,r,p*+,x,y);
  30. else return query(l,mid,p*,x,mid)+query(mid+,r,p*+,mid+,y);
  31. }
  32. }
  33. void change(int l,int r,int p,int x,int y,int zhi)
  34. {
  35. if (l==x&&r==y) add[p]+=zhi;
  36. else
  37. {
  38. tree[p]+=zhi*(y-x+);
  39. int mid=(l+r)>>;
  40. if (y<=mid) change(l,mid,p*,x,y,zhi);
  41. else if (x>mid) change(mid+,r,p*+,x,y,zhi);
  42. else
  43. {
  44. change(l,mid,p*,x,mid,zhi);
  45. change(mid+,r,p*+,mid+,y,zhi);
  46. }
  47. }
  48. }
  49. int main(){
  50. while (~scanf("%d%d",&n,&m)){
  51. for (int i=;i<=n;i++)
  52. scanf("%d",&a[i]);
  53. build(,n,);
  54. for (int i=;i<=m;i++){
  55. scanf("%s%d%d",&s,&x,&y);
  56. if (s[]=='Q') printf("%lld\n",query(,n,,x,y));
  57. else {
  58. scanf("%d",&z);
  59. change(,n,,x,y,z);
  60. }
  61. }
  62. }
  63. }

线段树虽然简单,但是树状数组就没有这么简单了,差分思想。

转换应该在树状数组blog上已经讲过了,会在blog上持续更新,最新的理解。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<iostream>
  6. #define N 100007
  7. using namespace std;
  8.  
  9. int n,m;
  10. long long c[N],d[N];
  11. char ch[];
  12.  
  13. int lowbit(int x)
  14. {
  15. return x&(-x);
  16. }
  17. void change(int x,int y,int z)
  18. {
  19. for (int i=x;i<=n;i+=lowbit(i))
  20. c[i]+=z;
  21. for (int i=y+;i<=n;i+=lowbit(i))
  22. c[i]-=z;
  23.  
  24. for (int i=x;i<=n;i+=lowbit(i))
  25. d[i]+=(long long)z*x;
  26. for (int i=y+;i<=n;i+=lowbit(i))
  27. d[i]-=(long long)z*(y+);
  28. }
  29. long long query(int x)
  30. {
  31. long long res=,ans=;
  32. for (int i=x;i>=;i-=lowbit(i))
  33. res+=c[i];
  34. ans+=res*(x+);
  35. res=;
  36. for (int i=x;i>=;i-=lowbit(i))
  37. res+=d[i];
  38. ans-=res;
  39. return ans;
  40. }
  41. int main()
  42. {
  43. scanf("%d%d",&n,&m);
  44. int last=,x,y,z;
  45. for (int i=;i<=n;i++)
  46. {
  47. scanf("%d",&x);
  48. y=x-last;
  49. change(i,n,y);
  50. last=x;
  51. }
  52. for (int i=;i<=m;i++)
  53. {
  54. scanf("%s",ch);
  55. if (ch[]=='Q')
  56. {
  57. scanf("%d%d",&x,&y);
  58. printf("%lld\n",query(y)-query(x-));
  59. }
  60. else
  61. {
  62. scanf("%d%d%d",&x,&y,&z);
  63. change(x,y,z);
  64. }
  65. }
  66. }

poj3468(一维)(区间查询,区间修改)的更多相关文章

  1. Libre OJ 130、131、132 (树状数组 单点修改、区间查询 -> 区间修改,单点查询 -> 区间修改,区间查询)

    这三题均可以用树状数组.分块或线段树来做 #130. 树状数组 1 :单点修改,区间查询 题目链接:https://loj.ac/problem/130 题目描述 这是一道模板题. 给定数列 a[1] ...

  2. C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)

    参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...

  3. HZAU 1207 Candies(线段树区间查询 区间修改)

    [题目链接]http://acm.hzau.edu.cn/problem.php?id=1207 [题意]给你一个字符串,然后两种操作:1,将区间L,R更新为A或者B,2,询问区间L,R最长的连续的B ...

  4. POJ3468(线段树 区间修改 lazy-tag)

    我的线段树真的没救了......还是多练几道吧....... You have N integers, A1, A2, ... , AN. You need to deal with two kind ...

  5. 线段树 区间查询区间修改 poj 3468

    #include<cstdio> #include<iostream> #include<algorithm> #include<string.h> u ...

  6. POJ - 2528 区间离散化,线段树区间修改,区间询问

    这个题非常有意思的地方是,我们发现区间[1,4]和[5,8]是紧挨着的,因为这个的数代表的是一段区间,原本我们对于普通的离散, a[1]=1,a[2]=5,a[3]=6,a[4]=8;数组下标就是重新 ...

  7. 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询

    题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...

  8. 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询

    题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...

  9. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  10. HDU - 1698 线段树区间修改,区间查询

    这就是很简单的基本的线段树的基本操作,区间修改,区间查询,对区间内部信息打上laze标记,然后维护即可. 我自己做的时候太傻逼了...把区间修改写错了,对给定区间进行修改的时候,mid取的是节点的左右 ...

随机推荐

  1. Java 得到磁盘以及内存信息

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt217 1.得到磁盘信息 File[] files = File. listR ...

  2. Opencv入门-第一回-梦牵机器视觉翼,初识Opencv域(安装Opencv)

    各位看官,您是不是瞅着Opencv进来的?(你这不是废话吗>_>) 这Opencv(开源计算机视觉库)啊,说来话长,最初是上个世纪末(1999年)由Intel建立起来的.近十多年人工智能这 ...

  3. unity3d 初学者遇到的坑(提醒自己不要范同样的错误)

    使用NGUI的过程中,总是会发生一些就像我这样的初学者遇到的坑:一直以为在创建  一直以为图中的文字Depth深度大于beijingheitu的深度,会显示在beijingheitu下所有子物体之上, ...

  4. 团队作业8——第二次项目冲刺(Beta版本)5.24

    1.当天站立式会议照片 会议内容 1.总结前几次会议中出现的问题. 2.对第二天需要做的任务进行分配. 3.询问团队队员任务完成情况以及时间分配是否充分. 4.对今后的任务,发表自己的看法. 2.每个 ...

  5. 201521123107 《Java程序设计》第8周学习总结

    第7周作业-集合 1.本周学习总结 2.书面作业 1.List中指定元素的删除 题集jmu-Java-05-集合之4-1 1.1 实验总结 这次的函数题是编写convertStringToList和r ...

  6. 团队作业八——第二次团队冲刺(Beta版本)第4天

    团队作业八--第二次团队冲刺(Beta版本)第4天 一.每个人的工作 (1) 昨天已完成的工作 做一下用户注册的功能和登录功能. (2) 今天计划完成的工作 完成界面跳转 (3) 工作中遇到的困难 界 ...

  7. 201521123061 《Java程序设计》第六周学习总结

    201521123061 <Java程序设计>第六周学习总结 ***代码阅读:Child压缩包内 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核 ...

  8. 201521123067 《Java程序设计》第10周学习总结

    201521123067 <Java程序设计>第10周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 Q1.final ...

  9. 201521123110《Java程序设计》第11周学习总结

    1. 本周学习总结 2. 书面作业 1.互斥访问与同步访问 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)? 1.2 同步代码块与同步 ...

  10. 201621123088《Java程序设计》第1周学习总结

    1.本周学习总结 以几个关键词描述本周的学习内容.并阐述关键概念之间的联系. 这周是我第一次学习Java,对于我这个上学期没有学好的人来说,Java无疑是一个新的噩梦,但是我相信我这学期一定能学好Ja ...