线段树

Posted hzoidj123

tags:

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

技术图片
 1 #include<cstdio>
 2 const int maxn=100000+10;
 3 typedef long long ll;
 4 ll a[maxn],tree[4*maxn],lazy[4*maxn];
 5 void Build(int rt,int l,int r){
 6      if(l==r) {
 7         tree[rt]=a[l];
 8         return;
 9      }   
10      int mid=(l+r)>>1;
11      Build(rt<<1,l,mid);
12      Build(rt<<1|1,mid+1,r);
13      tree[rt]=tree[rt<<1]+tree[rt<<1|1];
14 }
15 void update(int rt,int l,int r,ll w){
16      tree[rt]+=(r-l+1)*w;
17      lazy[rt]+=w;
18 }
19 void pushdown(int rt,int l,int r){
20      int mid=(l+r)>>1;
21      update(rt<<1,l,mid,lazy[rt]);
22      update(rt<<1|1,mid+1,r,lazy[rt]);
23      lazy[rt]=0;
24 }
25 ll query(int rt,int l,int r,int x){
26     if(l==r) return tree[rt];
27     int mid=(l+r)>>1;
28     pushdown(rt,l,r);
29     if(x<=mid) return query(rt<<1,l,mid,x);
30     else return query(rt<<1|1,mid+1,r,x); 
31 }
32 void modify(int rt,int l,int r,int s,int t,ll w){
33      if(s<=l&&t>=r){
34           update(rt,l,r,w);
35           return ;
36      }
37      pushdown(rt,l,r);
38      int mid=(l+r)>>1;
39      if(s<=mid) modify(rt<<1,l,mid,s,t,w);
40      if(t>mid) modify(rt<<1|1,mid+1,r,s,t,w);
41      tree[rt]=tree[rt<<1]+tree[rt<<1|1];
42 }
43 int main(){
44     int n;
45     scanf("%d",&n);
46     for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
47     Build(1,1,n);
48     int m;
49     scanf("%d",&m);
50     for(int i=1;i<=m;i++){
51          char s[8];
52          scanf("%s",s);
53          if(s[0]==Q){
54             int x;
55             scanf("%d",&x);
56             ll a=query(1,1,n,x);
57             printf("%lld
",a);
58          }
59          else {
60              int l,r;
61              ll w;
62              scanf("%d%d%lld",&l,&r,&w);
63              modify(1,1,n,l,r,w);
64          }
65     }
66    return 0;
67 }
View Code
技术图片
 1 #include<cstdio>
 2 #define lson rt<<1
 3 #define rson rt<<1|1
 4 const int maxn=1e6+10;
 5 int a[maxn]={},tree[4*maxn]={};
 6 void Build(int rt,int l,int r){
 7     if(l==r){
 8         tree[rt]=a[l];
 9         return ;
10     }
11     int mid=(l+r)>>1;
12     Build(lson,l,mid);
13     Build(rson,mid+1,r);
14     tree[rt]=tree[lson]+tree[rson];
15 }
16 int query(int rt,int l,int r,int s,int t){
17     if(s<=l&&t>=r) return tree[rt];
18     int mid=(l+r)>>1;
19     if(t<=mid) return query(lson,l,mid,s,t);
20     else if(s>mid) return query(rson,mid+1,r,s,t);
21     else return query(lson,l,mid,s,t)+query(rson,mid+1,r,s,t);
22 }
23 void modify(int rt,int l,int r,int x,int y){
24     if(l==r){
25         tree[rt]+=y;
26         return;
27     }
28     int mid=(l+r)>>1;
29     if(x<=mid) modify(lson,l,mid,x,y);
30     else modify(rson,mid+1,r,x,y);
31     tree[rt]=tree[lson]+tree[rson];
32 } 
33 int main(){
34     int n,m;
35     scanf("%d",&n);
36     if(n!=0){
37         for(int i=1;i<=n;i++){
38             scanf("%d",&a[i]);
39         }
40         Build(1,1,n);
41         scanf("%d",&m);
42         char s[5];
43         int k,d,tot=0;
44         for(int i=1;i<=m;i++){
45             scanf("%s%d%d",s,&k,&d);
46             if(s[0]==S){
47                 printf("%d
",query(1,1,n,k,d));
48             }
49             else modify(1,1,n,k,d);
50         }
51     }
52     else {
53         scanf("%d",&m);
54         char s[5];
55         int a,b;
56         for(int i=1;i<=m;i++){
57             scanf("%s%d%d",s,&a,&b);
58             if(s[0]==S) printf("0
");
59         }
60     }
61     return 0;
62 } 
View Code
技术图片
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=1e6+10;
 6 int a[maxn],tree[maxn*4];
 7 void Build(int rt,int l,int r){
 8     if(l==r){
 9         tree[rt]=a[l];
10         return;
11     }
12     int mid=(l+r)>>1;
13     Build(rt<<1,l,mid);
14     Build(rt<<1|1,mid+1,r);
15     tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
16 }
17 int query(int rt,int l,int r,int k,int d){
18     if(k<=l&&d>=r) return tree[rt];
19     int mid=(l+r)>>1;
20     if(d<=mid) return query(rt<<1,l,mid,k,d);
21     else if(k>mid) return query(rt<<1|1,mid+1,r,k,d);
22     else return max(query(rt<<1,l,mid,k,d),query(rt<<1|1,mid+1,r,k,d));
23 }
24 int main(){
25     int n;
26     scanf("%d",&n);
27     for(int i=0;i<=n;i++) scanf("%d",&a[i]);
28     Build(1,1,n);
29     int q;
30     scanf("%d",&q);
31     int a,b;
32     for(int i=1;i<=q;i++){
33         scanf("%d%d",&a,&b);
34         int j=query(1,1,n,a,b);
35         printf("%d
",j);      
36     }
37     return 0;
View Code

 

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

线段树

CCF(除法):线段树区间修改(50分)+线段树点修改(100分)+线段树(100分)

线段树合并

数据结构——线段树

论线段树:二

线段树