线段树模板
Posted Point
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树模板相关的知识,希望对你有一定的参考价值。
Input
第一行有一个整数nn,表示花朵的总数目。
第二行包含nn个整数aiai,表示第ii朵花初始的愉悦值。
第三行包含一个整数mm,表示秋实大哥唱了mm天的歌。
接下来mm行,每行包含三个整数ll rr vv,表示秋实大哥对着[l,r][l,r]这个区间内的花朵歌唱,每朵花的愉悦值增加了vv。
1≤n,m,ai,|v|≤1000001≤n,m,ai,|v|≤100000,1≤l≤r≤n。1≤l≤r≤n。
Output
输出共mm行,第ii行表示秋实大哥完成第ii天的歌唱后,那一段花朵的愉悦值总和
区间修改,区间查询,求和
1 //#include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 //using namespace std; 7 const int maxn = 1e5+6; 8 #define LL long long 9 #define INF 0x7fffffff 10 11 int n,a[maxn],q; 12 13 struct node 14 { 15 int l,r; 16 long long sum,lazy; 17 void update(long long x) 18 { 19 sum+=(r-l+1)*x; 20 lazy+=x; 21 } 22 }tree[maxn*4]; 23 24 void push_up(int x) 25 { 26 tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum; 27 } 28 29 void push_down(int x) 30 { 31 int lazyval=tree[x].lazy; 32 if(lazyval) 33 { 34 tree[x<<1].update(lazyval); 35 tree[x<<1|1].update(lazyval); 36 tree[x].lazy=0; 37 } 38 } 39 void build(int x,int l,int r) 40 { 41 tree[x].l=l,tree[x].r=r; 42 tree[x].sum=tree[x].lazy=0; 43 if(l==r) 44 { 45 tree[x].sum=a[l]; 46 } 47 else 48 { 49 int mid = (l+r)/2; 50 build(x<<1,l,mid); 51 build(x<<1|1,mid+1,r); 52 push_up(x); 53 } 54 } 55 void update(int x,int l,int r,long long val) 56 { 57 int L =tree[x].l, R = tree[x].r; 58 if(l<=L&&R<=r) 59 { 60 tree[x].update(val); 61 } 62 else 63 { 64 push_down(x); 65 int mid = (L+R)/2; 66 if(mid>=l)update(x<<1,l,r,val); 67 if(r>mid)update(x<<1|1,l,r,val); 68 push_up(x); 69 } 70 } 71 72 long long query(int x,int l,int r) 73 { 74 int L =tree[x].l, R = tree[x].r; 75 if(l<=L&&R<<r) 76 return tree[x].sum; 77 else 78 { 79 push_down(x); 80 long long ans=0; 81 int mid = (L+R)/2; 82 if(mid>=l)ans+=query(x<<1,l,r); 83 if(r>mid)ans+=query(x<<1|1,l,r); 84 push_up(x); 85 return ans; 86 } 87 } 88 89 int main() { 90 scanf("%d",&n); 91 for(int i=1;i<=n;i++) 92 scanf("%d",&a[i]); 93 build(1,1,n); 94 scanf("%d",&q); 95 for(int i=1;i<=q;i++) 96 { 97 int l,r,val; 98 scanf("%d%d%d",&l,&r,&val); 99 update(1,l,r,val); 100 printf("%lld\n",query(1,l,r)); 101 } 102 return 0; 103 }
以上是关于线段树模板的主要内容,如果未能解决你的问题,请参考以下文章