洛谷 P3372 【模板】线段树 1
来源:互联网 发布:java服务器插件 编辑:程序博客网 时间:2024/06/05 12:04
洛谷 P3372 【模板】线段树 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的结果。
输入输出样例
输入样例#1:
5 51 5 4 2 32 2 41 2 3 22 3 41 1 5 12 1 4
输出样例#1:
11820
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=1000,M<=10000
对于100%的数据:N<=100000,M<=100000
(数据已经过加强^_^,保证在int64/long long数据范围内)
题解
线段树模板……
代码
#include<cstdio>#define ls l,m,rt<<1#define rs m+1,r,rt<<1|1#define maxn 100005#define ll long longusing namespace std;int q,a,b,c,n,m;ll mark[maxn<<2],sum[maxn<<2];void change(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){ mark[rt]=0; if (l==r) { scanf("%lld",&sum[rt]); return; } int m=(l+r)>>1; build(ls);build(rs); change(rt);}void pushdown(int rt,int len){ if (mark[rt]){ mark[rt<<1]+=mark[rt]; mark[rt<<1|1]+=mark[rt]; sum[rt<<1]+=mark[rt]*(len-(len>>1)); sum[rt<<1|1]+=mark[rt]*(len>>1); mark[rt]=0; }}void update(int L,int R,int add,int l,int r,int rt){ if (L<=l&&r<=R) { mark[rt]+=add; sum[rt]+=(ll)add*(r-l+1); return; } pushdown(rt,r-l+1); int m=(l+r)>>1; if (L<=m) update(L,R,add,ls); if (m<R) update(L,R,add,rs); change(rt);}ll query(int L,int R,int l,int r,int rt){ if (L<=l&&r<=R) return sum[rt]; pushdown(rt,r-l+1); ll tot=0; int m=(l+r)>>1; if (L<=m) tot+=query(L,R,ls); if (m<R) tot+=query(L,R,rs); return tot;}int main(){ scanf("%d%d",&n,&m); build(1,n,1); for (int i=1;i<=m;i++) { scanf("%d",&q); if (q==1){ scanf("%d%d%d",&a,&b,&c); update(a,b,c,1,n,1); } else { scanf("%d%d",&a,&b); printf("%lld\n",query(a,b,1,n,1)); } } return 0;}
阅读全文
1 0
- 【洛谷P3372】【模板】线段树 1
- 洛谷 P3372【模板】线段树 1
- 洛谷P3372 【模板】线段树 1
- 洛谷 P3372 【模板】线段树 1
- 【洛谷P3372】【模板】线段树1
- 洛谷 P3372 线段树模板
- [P3372][模板]线段树1
- 【洛谷】P3372线段树1 线段树模板
- 洛谷P3372线段树模板1(改段求段)
- 洛谷P3372 【模板】线段树 1(lazy)
- 【模板】树状数组 区间修改,区间求和 (模板题:洛谷P3372线段树1)
- 洛谷p3372 线段树模版
- Luogu-P3372 (Lazy_tag 线段树模板)
- 【模板】线段树 区间加,区间求和 (模板题:P3372线段树1)
- 洛谷 P3372 线段树 1(树状数组做法)
- 关于 线段树 下传(AC) 不做标记 下传(T3)模板洛谷p3372
- 【模板】线段树 1
- 线段树模板1
- permutations
- hdu 4406 #最大费用流
- 拓扑序列_邻接矩阵实现(Topological sequence)
- Java中substring、split、StringTokenizer三种截取字符串方法的性能比较
- HDU OJ 2005 第几天?
- 洛谷 P3372 【模板】线段树 1
- 初学c++の命名空间
- 属性动画之☞valueanimator
- Linux下使用mysql遇到的问题
- C和C++中的名字空间和作用域
- 没有配置监听器,加载器,和加载文件类时怎么得到bean
- iOS 8苹方体使用说明
- POJ3280 Cheapest Palindrome (区间dp)
- Binary_Code 2-SAT神题