题目描述

如题,已知一个数列,你需要进行下面两种操作:

1.将某区间每一个数加上x

2.求出某区间每一个数的和

输入输出格式

输入格式:

第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含3或4个整数,表示一个操作,具体如下:

操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k

操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和

输出格式:

输出包含若干行整数,即为所有操作2的结果。

输入输出样例

输入样例#1: 复制

  1. 5 5
  2. 1 5 4 2 3
  3. 2 2 4
  4. 1 2 3 2
  5. 2 3 4
  6. 1 1 5 1
  7. 2 1 4
输出样例#1: 复制

  1. 11
  2. 8
  3. 20

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=1000,M<=10000

对于100%的数据:N<=100000,M<=100000

(数据已经过加强^_^,保证在int64/long long数据范围内)

样例说明:

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int maxn=;
  6.  
  7. int a[maxn+];
  8.  
  9. struct tree
  10. {
  11. int l,r;
  12. long long pre,add;
  13. }t[*maxn+];
  14.  
  15. void bulid(int p,int l,int r)
  16. {
  17. t[p].l=l;t[p].r=r;
  18. if(l==r)
  19. {
  20. t[p].pre=a[l];
  21. return;
  22. }
  23. int mid=l+r>>;
  24. bulid(p*,l,mid);
  25. bulid(p*+,mid+,r);
  26. t[p].pre=t[p*].pre+t[p*+].pre;
  27. }
  28.  
  29. void spread(int p)
  30. {
  31. if(t[p].add)
  32. {
  33. t[p*].pre+=t[p].add*(t[p*].r-t[p*].l+);
  34. t[p*+].pre+=t[p].add*(t[p*+].r-t[p*+].l+);
  35. t[p*].add+=t[p].add;
  36. t[p*+].add+=t[p].add;
  37. t[p].add=;
  38. }
  39. }
  40.  
  41. void change(int p,int x,int y,int z)
  42. {
  43. if(x<=t[p].l && y>=t[p].r)
  44. {
  45. t[p].pre+=(long long)z*(t[p].r-t[p].l+);
  46. t[p].add+=z;
  47. return;
  48. }
  49. spread(p);
  50. int mid=t[p].l+t[p].r>>;
  51. if(x<=mid) change(p*,x,y,z);
  52. if(y>mid) change(p*+,x,y,z);
  53. t[p].pre=t[p*].pre+t[p*+].pre;
  54. }
  55.  
  56. long long ask(int p,int x,int y)
  57. {
  58. if(x<=t[p].l && y>=t[p].r) return t[p].pre;
  59. spread(p);
  60. int mid=t[p].l+t[p].r>>;
  61. long long ans=;
  62. if(x<=mid) ans+=ask(p*,x,y);
  63. if(y>mid) ans+=ask(p*+,x,y);
  64. return ans;
  65. }
  66.  
  67. int main()
  68. {
  69. int n,m;
  70. scanf("%d%d",&n,&m);
  71. for(int i=;i<=n;i++)
  72. scanf("%d",&a[i]);
  73. bulid(,,n);
  74. for(int i=;i<=m;i++)
  75. {
  76. int q,x,y,z;
  77. scanf("%d",&q);
  78. if(q==)
  79. {
  80. scanf("%d%d%d",&x,&y,&z);
  81. change(,x,y,z);
  82. }
  83. else
  84. {
  85. scanf("%d%d",&x,&y);
  86. cout<<ask(,x,y)<<endl;
  87. }
  88. }
  89. return ;
  90. }

P3372 【模板】线段树 1的更多相关文章

  1. hdu 1754 I Hate It (模板线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    M ...

  2. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  3. 【线段树】【P3372】模板-线段树

    百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...

  4. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  5. 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)

    实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...

  6. 【洛谷 p3372】模板-线段树 1(数据结构--线段树)

    题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x:2.求出某区间每一个数的和. 解法:如题,模版题.需要加上 lazy 标记,也就是我的 upd.lazy 标记的思路就是对一个结 ...

  7. 【洛谷 p3373】模板-线段树 2(数据结构--线段树)

    题意:已知一个数列,你需要进行下面三种操作:1.将某区间每一个数加上x:2.将某区间每一个数乘上x:3.求出某区间每一个数的和. 解法:(唉 :-(,这题卡住我了......)对于加法和乘法的混合操作 ...

  8. hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)

    I Hate ItTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. poj 3468 A Simple Problem with Integers 线段树 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=3468 线段树模板 要背下此模板 线段树 #include <iostream> #include <vector> ...

  10. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

随机推荐

  1. 通过css改变svg img的颜色

    需求如下图,hover的时候改变图标颜色,图标为引入的svg img 一般的解决办法有:1.字体图标改变css的color属性:2.js在hover事件中切换图片:3.老一点的方案是hover切换背景 ...

  2. 【20190223】HTTP-知识点整理:HTTPS

    HTTPS:添加了加密及认证机制的HTTP HTTPS 并非是应用层的一种新协议.只是 HTTP 通信接口部分用SSL(Secure Socket Layer)和 TLS(Transport Laye ...

  3. Pycharm基本设置和插件安装

    Pycharm调节主题和字体 调节主题:File - Setting - Editor - Color Scheme - 选择个人喜欢的风格 调节字体大小,感觉默认字体有点小,对我这样的老人家,至少要 ...

  4. springboot 学习之路 7(静态页面自动生效问题)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  5. Windows Server 2012更新补丁后导致Micosoft ODBC for Oracle出现问题

    上周由于WannaCry勒索病毒肆虐全球,14号系统管理员更新了一系列补丁后,导致一Windows Server 2012服务器上面部署的一些老旧的应用无法使用Microsoft ODBC for O ...

  6. C#核心基础--浅谈类和对象的概念

    浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...

  7. CentOS7中安装MySQL5.7

    安装必要的组件 yum install –y autoconf automake imake libxml2-devel expat-devel cmake gcc gcc-c++ libaio li ...

  8. EOS智能合约开发(一):EOS环境搭建和启动节点

    EOS和以太坊很像,EOS很明确的说明它就是一个区块链的操作系统,BM在博客中也是说过的. 可以这样比喻,EOS就相当于内置激励系统的Windows/Linux/MacOS,这是它的一个定位. 包括以 ...

  9. c/c++ 编译器提供的默认6个函数

    c/c++ 编译器提供的默认6个函数 1,构造函数 2,拷贝构造函数 3,析构函数 4,=重载函数 5,&重载函数 6,const&重载函数 #include <iostream ...

  10. python拟合数据,并通过拟合的曲线去预测新值的方法

    from scipy import interpolate import matplotlib.pyplot as plt import numpy as np def f(x): x_points ...