线段树模板

Posted Point

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树模板相关的知识,希望对你有一定的参考价值。

Input

第一行有一个整数nn,表示花朵的总数目。

第二行包含nn个整数aiai,表示第ii朵花初始的愉悦值。

第三行包含一个整数mm,表示秋实大哥唱了mm天的歌。

接下来mm行,每行包含三个整数lrvv,表示秋实大哥对着[l,r][l,r]这个区间内的花朵歌唱,每朵花的愉悦值增加了vv。

1nmai|v|1000001≤n,m,ai,|v|≤100000,1lrn1≤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 }

 

以上是关于线段树模板的主要内容,如果未能解决你的问题,请参考以下文章

线段树模板整理

线段树模板总结

线段树模板

模板线段树-单点修改,区间查询

P3834 模板可持久化线段树 1(主席树)

模板 线段树(部分功能)