线段树模板题

1.HDU 1754 (点修改)

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))

using namespace std;

const int maxn = 200000 + 5 , inf = 0x3f3f3f3f ;

int sum[maxn*4],A[maxn];

void PushUp(int rt){sum[rt] =  max(sum[rt*2],sum[rt*2+1]);}
void Build(int l,int r,int rt){
    if(l==r){
        sum[rt]=A[l];
        return;
    }
    int m = (l+r)/2;
    Build(l,m,rt*2);
    Build(m+1,r,rt*2+1);
    PushUp(rt);
}
void Updata(int L,int c,int l,int r,int rt){
    if(r==l){
        sum[rt] = c;
        return;
    }
    int m = (l+r)/2;
    if(L<=m) Updata(L,c,l,m,rt*2);
    else     Updata(L,c,m+1,r,rt*2+1);
    PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
    if(L<=l&&r<=R){
        return sum[rt];
    }
    int m = (l+r)/2;
    int ans = 0;
    if(L<=m) ans = max(ans,Query(L,R,l,m,rt*2));
    if(R>m ) ans = max(ans,Query(L,R,m+1,r,rt*2+1));
    return ans;
}
int main(){
    char c;
    int n,m,a,b;
    while(scanf("%d %d",&n,&m)!=EOF){
        mem(sum);mem(A);
        for(int i=1;i<=n;i++)scanf("%d",&A[i]);
        Build(1,n,1);
        while(m--){
            scanf(" %c",&c);
            if(c=='Q'){
                scanf("%d %d",&a,&b);
                printf("%d\n",Query(a,b,1,n,1));
            }else{
                scanf("%d %d",&a,&b);
                Updata(a,b,1,n,1);
            }
        }
    }
    return 0;
}

2.POJ 3468 (区间修改)

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))

using namespace std;

const int maxn = 100000 + 7 , inf = 0x3f3f3f3f ;
ll sum[maxn<<2],add[maxn<<2];
ll A[maxn];
int n,sum_cmd;

void Pushup(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}

void Build(int l,int r,int rt){
    if(l==r){
        sum[rt] = A[l];
        return;
    }
    int m = (l+r)>>1;
    Build(l,m,rt<<1);
    Build(m+1,r,rt<<1|1);
    Pushup(rt);
}
void PushDown(int rt,int ln,int rn){
    if(add[rt]){
        add[rt<<1]+=add[rt];
        add[rt<<1|1]+=add[rt];
        sum[rt<<1]+=add[rt]*ln;
        sum[rt<<1|1]+=add[rt]*rn;
        add[rt] = 0;
    }
}
void Updata(int L,int R,int C,int l,int r,int rt){
    if(L<=l&&r<=R){
        sum[rt]+=C*(r-l+1);
        add[rt]+=C;
        return;
    }
    int m = (r+l)>>1;
    PushDown(rt,m-l+1,r-m);
    if(L<=m) Updata(L,R,C,l,m,rt<<1);
    if(R> m) Updata(L,R,C,m+1,r,rt<<1|1);
    Pushup(rt);
}
ll Query(int L,int R,int l,int r,int rt){
    if(L<=l&&r<=R){
        return sum[rt];
    }
    int m = (l+r)>>1;
    PushDown(rt,m-l+1,r-m);
    ll ans = 0;
    if(L<=m) ans+=Query(L,R,l,m,rt<<1);
    if(R >m) ans+=Query(L,R,m+1,r,rt<<1|1);
    return ans;
}
int main(){
    char cmd;
    ll a,b,c;
    while(~scanf("%d %d",&n,&sum_cmd)){
        mem(A);mem(sum);mem(add);
        for(int i = 1 ; i <= n ; i ++ )scanf("%lld",&A[i]);
        Build(1,n,1);
        while(sum_cmd--){
            scanf(" %c",&cmd);
            if(cmd=='Q'){
                scanf("%lld %lld",&a,&b);
                printf("%lld\n",Query(a,b,1,n,1));
            }else if(cmd=='C'){
                scanf("%lld %lld %lld",&a,&b,&c);
                Updata(a,b,c,1,n,1);
            }
        }
    }
    return 0;
}

3.HDU 1754(区间求最大值)

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))

using namespace std;

const int maxn = 200000 + 5 , inf = 0x3f3f3f3f ;

int sum[maxn*4],A[maxn];

void PushUp(int rt){sum[rt] =  max(sum[rt*2],sum[rt*2+1]);}
void Build(int l,int r,int rt){
    if(l==r){
        sum[rt]=A[l];
        return;
    }
    int m = (l+r)/2;
    Build(l,m,rt*2);
    Build(m+1,r,rt*2+1);
    PushUp(rt);
}
void Updata(int L,int c,int l,int r,int rt){
    if(r==l){
        sum[rt] = c;
        return;
    }
    int m = (l+r)/2;
    if(L<=m) Updata(L,c,l,m,rt*2);
    else     Updata(L,c,m+1,r,rt*2+1);
    PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
    if(L<=l&&r<=R){
        return sum[rt];
    }
    int m = (l+r)/2;
    int ans = 0;
    if(L<=m) ans = max(ans,Query(L,R,l,m,rt*2));
    if(R>m ) ans = max(ans,Query(L,R,m+1,r,rt*2+1));
    return ans;
}
int main(){
    char c;
    int n,m,a,b;
    while(scanf("%d %d",&n,&m)!=EOF){
        mem(sum);mem(A);
        for(int i=1;i<=n;i++)scanf("%d",&A[i]);
        Build(1,n,1);
        while(m--){
            scanf(" %c",&c);
            if(c=='Q'){
                scanf("%d %d",&a,&b);
                printf("%d\n",Query(a,b,1,n,1));
            }else{
                scanf("%d %d",&a,&b);
                Updata(a,b,1,n,1);
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/insist_77/article/details/80372912