【luogu3372】模板 线段树1
2018-03-28 21:09
495 查看
0x01题面:
给一个长为n的数列,支持以下2种操作。n<=105n<=1051.将某区间每一个数加上x
2.求出某区间每一个数的和
0x02思路:
线段树模板啊。。。。0x03代码:
#include<iostream> #define maxn 100010 #define lch p<<1 #define rch p<<1|1 using namespace std; typedef long long LL; struct node{ LL val, addmark; }sgt[maxn<<2]; void pushdown(LL p, LL l, LL r){ if(sgt[p].addmark != 0){ LL t = sgt[p].addmark, m = l+r>>1; sgt[lch].addmark += t; sgt[rch].addmark += t; sgt[lch].val += t*(m-l+1); sgt[rch].val += t*(r-m); sgt[p].addmark = 0; } } void update(LL p, LL l, LL r, LL L, LL R, LL v){ if(l > R || r < L)return ; //越界返回 if(L <= l && R >= r){ sgt[p].addmark += v; sgt[p].val += v*(r-l+1); return ; } pushdown(p, l, r);//记得pushdown 的位置 每次递归前 LL m = l+r>>1; update(lch, l, m, L, R, v); update(rch, m+1, r, L, R, v); sgt[p].val = sgt[lch].val + sgt[rch].val; } LL query(LL p, LL l, LL r, LL L, LL R){ if(l > R || r < L)return 0; //越界返回 if(L <= l && R >= r)return sgt[p].val; pushdown(p,l,r); LL m = l+r>>1, ans = 0; ans += query(lch, l, m, L , R); ans += query(rch, m+1, r, L , R); return ans; } int main(){ LL n, m; cin>>n>>m; for(int i = 1; i <= n; i++){ LL x; cin>>x; update(1, 1, n, i, i, x); } for(int i = 1; i <= m; i++){ LL op; cin>>op; if(op == 1){ LL x, y, k; cin>>x>>y>>k; update(1,1,n,x,y,k); }else{ LL x, y; cin>>x>>y; cout<<query(1, 1, n, x, y)<<"\n"; } } return 0; }
占坑待填
0x00背景知识
为什么要用线段树。我们考虑以下几种常用序列操作。
单点求和:朴素(1),sgt(logn)
区间求和:朴素(n),sgt(logn)
单点修改:朴素(1),sgt(logn)
区间修改:朴素(n),sgt(logn)
啊
相关文章推荐
- 【Splay】洛谷3372 【模板】线段树 1
- Luogu_3373 (双 tag 线段树模板)
- [luogu3373][模板]线段树 2(线段树)
- 洛谷3372[模板]线段树1
- 【模板】线段树 洛谷 3372 线段树
- Luogu-P3372 (Lazy_tag 线段树模板)
- 洛谷 3372_【模板】线段树 1_线段树
- 树状数组 线段树 模板
- [Luogu] 模板题-最近公共祖先
- hdu1754—I Hate It(线段树模板)
- 【线段树模板!!!】hdu-1394 顺便学习一下not only succes 的线段树风格
- 线段树实现RMQ问题(线段树模板的基本应用)
- 线段树 模板
- [模板]线段树
- 线段树,小模板
- HDU 1754 线段树模板
- 洛谷P3372 【模板】线段树 1
- hdu 1754 I Hate It【线段树入门+模板详解】
- 【线段树】模板
- 【模板】线段树 1