题目描述

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

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复制

5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4

输出 #1复制

11
8
20

说明/提示

时空限制:1000ms,128M

数据规模:

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

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

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

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

样例说明:

题解:复习一下线段树咳咳咳,几乎模板,但是我居然忘记在int main()里面调用build

我跟我旁边的王同学找了好久。。。。气死了嘤嘤嘤

// luogu-judger-enable-o2
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int N=100003;
typedef long long ll;
ll z,k,sum[N*4],add[N*4],a[N];
int n,akioi,x,y,biu;void pushup(int rt){sum[rt]=sum[rt*2]+sum[rt*2+1];
}void build(int l,int r,int rt){if(l==r){sum[rt]=a[l];return;}int m=(l+r)/2;build(l,m,rt*2);build(m+1,r,rt*2+1);pushup(rt);
}void pushdown(int rt,int ln,int rn){if(add[rt]){add[rt*2]+=add[rt];add[rt*2+1]+=add[rt];sum[rt*2]+=add[rt]*ln;sum[rt*2+1]+=add[rt]*rn;add[rt]=0;}
}ll query(int L,int R,int l,int r,int rt){if(L<=l && R>=r)return sum[rt];int m=(l+r)/2;pushdown(rt,m-l+1,r-m);ll ans=0;if(L<=m) ans+=query(L,R,l,m,rt*2);if(R> m) ans+=query(L,R,m+1,r,rt*2+1);return ans;
}void update(int L,int R,ll k,int l,int r,int rt){if(L<=l && R>=r){sum[rt]+=k*(r-l+1);add[rt]+=k;return ;    } int m=(l+r)/2;pushdown(rt,m-l+1,r-m);if(L<=m) update(L,R,k,l,m,rt*2);if(R>m)  update(L,R,k,m+1,r,rt*2+1);pushup(rt);
}int main(){scanf("%d %d",&n,&akioi);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);build(1,n,1);while(akioi--){//cout<<7666;scanf("%d",&biu);if(biu==2){scanf("%d %d",&x,&y);printf("%lld\n",query(x,y,1,n,1));}else{scanf("%d %d %lld",&x,&y,&z);update(x,y,z,1,n,1);}}return 0;
}

转载于:https://www.cnblogs.com/wuhu-JJJ/p/11324509.html

【洛谷 3372】线段树 1相关推荐

  1. 洛谷 P3373 线段树2

    洛谷 P3373 线段树2 mul和pls更新某区间左右子树sum的时候,别忘了回头更新这个区间的sum 只有在传递给子序列之后,父序列的lz标记才能清零.其他时候,lz标记只增不减 #include ...

  2. 洛谷P3373线段树

    洛谷P3373 线段树模板题,主要对懒标的处理要求比较高. 有三种操作: 区间加法 区间乘法 区间求和查询 tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown, ...

  3. 洛谷3373 线段树模板

    题目详情:https://www.luogu.org/problemnew/show/P3373 这个线段树模板写的头疼(最后纠错发现一个long long没开差点一口血喷出来),思路就是在普通的求区 ...

  4. 洛谷P3373线段树2

    题目描述 区间查询区间修改,非常明显的线段树模板,但乘法和加法的结合,使问题有了些小改动: problem: 该题唯一的难点就是加法和乘法的lazytag的处理,设目前区间N.s(即区间和)=x,若先 ...

  5. 洛谷P3373 线段树2(乘法加法lazytag)

    线段树模板题,含lazytag的线段树码量本身就比较大,再加入乘法标记,还要考虑先乘后加的问题,本蒟蒻一调就是几个小时. P3373 [模板]线段树 2https://www.luogu.com.cn ...

  6. [WC2005]双面棋盘,洛谷P4121,线段树分治+可撤销并查集

    正题 这题主要是来练手的,因为没写过可撤销的并查集,大概就是把每一个格子看成一个点,然后格子直接的边有很多的出现区间,把这些出现区间和对应的颜色打到线段树上,然后用可撤销的并查集来维护就可以了. #i ...

  7. 洛谷 3373 线段树

    传送门 思路: 关键在于乘与加的先后计算关系,(x + y) * k = x * k + y * k,从这里可以看出来,把加法转化为乘法计算,取消了+与*先后顺序 pushdown时,即为乘法标记 * ...

  8. 洛谷 P3373 线段树模板题

    链接:https://www.luogu.com.cn/problem/P3373 题意:一个区间 三种操作 1 给lr范围内乘一个数 2 给lr范围内加一个数 3 询问lr范围内的和 啊这题真·做了 ...

  9. 洛谷[P3374] [P3368]树状数组(线段树解法)

    最近学习了线段树,不会树状数组,用线段树舔着脸来做一下 P3374树状数组1https://www.luogu.com.cn/problem/P3374 ac代码 #include<bits/s ...

最新文章

  1. The application does not contain a valid bundle identifier.解决方法
  2. 微信小游戏视频激励广告onClose接口叠加回调的问题解决方法
  3. MMDetection-数据准备
  4. 论文浅尝 - WWW2020 | 生成多跳推理问题以改善机器阅读理解能力
  5. python自动化_python自动化办公?学这些就够用了
  6. C#.NET验证码智能识别学习笔记---01C#.NET验证码识别介绍
  7. quartz集群分布式(并发)部署解决方案-Spring
  8. 大厂程序员手把手教你如何写简历(附简历模板)
  9. 程序关闭是总是出异常解决方法
  10. springboot - 应用实践(2)第一个springboot应用
  11. Android Facebook登陆获取 Key Hashes值
  12. 可汗学院公开课:统计学
  13. 实现TCP协议端到端的可靠传输 RDT
  14. 安装postman工具 出现请设置注册表项HKLM\Software\Microsoft\.NETFramework\InstallRoot,指向.NET Fra
  15. group normalization
  16. LaTeX 美化表格位置
  17. BLOB图像处理技术
  18. 致敬第一个1024(第一次Java代码编程)
  19. 计算机硬件相关行业,2021年中国电脑硬件行业市场规模及发展前景预测分析(图)...
  20. 采购SRM系统应该选哪个?

热门文章

  1. puppetter安装就踩坑-解决篇
  2. 软件的安装(包括yum仓库与源码包的安装)
  3. ArrayList实现原理
  4. OSPF 形成邻居 关系的条件
  5. jQuery小测试系列之jQuery基础知识
  6. 脚印:关于错误编码的管理的一些思考
  7. C#有关Session 操作的几个误区【转】
  8. lecture notes for investment bank internship
  9. enterprise architect (EA) 源码生成UML类图
  10. 一个rshinyapp的学习视频就是2个小时,看来李刚民老师说的是对的,最重要的是快速学习一个语言并且实践的能力