【洛谷 3372】线段树 1
题目描述
如题,已知一个数列,你需要进行下面两种操作:
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的结果。
输入输出样例
5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4
11 8 20
说明/提示
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=1000,M<=10000
对于100%的数据:N<=100000,M<=100000
(数据已经过加强^_^,保证在int64/long long数据范围内)
样例说明:
我跟我旁边的王同学找了好久。。。。气死了嘤嘤嘤
// 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相关推荐
- 洛谷 P3373 线段树2
洛谷 P3373 线段树2 mul和pls更新某区间左右子树sum的时候,别忘了回头更新这个区间的sum 只有在传递给子序列之后,父序列的lz标记才能清零.其他时候,lz标记只增不减 #include ...
- 洛谷P3373线段树
洛谷P3373 线段树模板题,主要对懒标的处理要求比较高. 有三种操作: 区间加法 区间乘法 区间求和查询 tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown, ...
- 洛谷3373 线段树模板
题目详情:https://www.luogu.org/problemnew/show/P3373 这个线段树模板写的头疼(最后纠错发现一个long long没开差点一口血喷出来),思路就是在普通的求区 ...
- 洛谷P3373线段树2
题目描述 区间查询区间修改,非常明显的线段树模板,但乘法和加法的结合,使问题有了些小改动: problem: 该题唯一的难点就是加法和乘法的lazytag的处理,设目前区间N.s(即区间和)=x,若先 ...
- 洛谷P3373 线段树2(乘法加法lazytag)
线段树模板题,含lazytag的线段树码量本身就比较大,再加入乘法标记,还要考虑先乘后加的问题,本蒟蒻一调就是几个小时. P3373 [模板]线段树 2https://www.luogu.com.cn ...
- [WC2005]双面棋盘,洛谷P4121,线段树分治+可撤销并查集
正题 这题主要是来练手的,因为没写过可撤销的并查集,大概就是把每一个格子看成一个点,然后格子直接的边有很多的出现区间,把这些出现区间和对应的颜色打到线段树上,然后用可撤销的并查集来维护就可以了. #i ...
- 洛谷 3373 线段树
传送门 思路: 关键在于乘与加的先后计算关系,(x + y) * k = x * k + y * k,从这里可以看出来,把加法转化为乘法计算,取消了+与*先后顺序 pushdown时,即为乘法标记 * ...
- 洛谷 P3373 线段树模板题
链接:https://www.luogu.com.cn/problem/P3373 题意:一个区间 三种操作 1 给lr范围内乘一个数 2 给lr范围内加一个数 3 询问lr范围内的和 啊这题真·做了 ...
- 洛谷[P3374] [P3368]树状数组(线段树解法)
最近学习了线段树,不会树状数组,用线段树舔着脸来做一下 P3374树状数组1https://www.luogu.com.cn/problem/P3374 ac代码 #include<bits/s ...
最新文章
- The application does not contain a valid bundle identifier.解决方法
- 微信小游戏视频激励广告onClose接口叠加回调的问题解决方法
- MMDetection-数据准备
- 论文浅尝 - WWW2020 | 生成多跳推理问题以改善机器阅读理解能力
- python自动化_python自动化办公?学这些就够用了
- C#.NET验证码智能识别学习笔记---01C#.NET验证码识别介绍
- quartz集群分布式(并发)部署解决方案-Spring
- 大厂程序员手把手教你如何写简历(附简历模板)
- 程序关闭是总是出异常解决方法
- springboot - 应用实践(2)第一个springboot应用
- Android Facebook登陆获取 Key Hashes值
- 可汗学院公开课:统计学
- 实现TCP协议端到端的可靠传输 RDT
- 安装postman工具 出现请设置注册表项HKLM\Software\Microsoft\.NETFramework\InstallRoot,指向.NET Fra
- group normalization
- LaTeX 美化表格位置
- BLOB图像处理技术
- 致敬第一个1024(第一次Java代码编程)
- 计算机硬件相关行业,2021年中国电脑硬件行业市场规模及发展前景预测分析(图)...
- 采购SRM系统应该选哪个?