zoukankan      html  css  js  c++  java
  • SPOJ

    GSS1

    #include<cstdio>
    #include<iostream>
    #define lc k<<1
    #define rc k<<1|1
    using namespace std;
    const int M=1e5+5,N=M<<2;
    struct sgt{
        int sum,gss,lgss,rgss;
    }tr[N];
    int n,m,a[N];
    void updata(int k){
        tr[k].sum=tr[lc].sum+tr[rc].sum;
        tr[k].lgss=max(tr[lc].lgss,tr[lc].sum+tr[rc].lgss);
        tr[k].rgss=max(tr[rc].rgss,tr[rc].sum+tr[lc].rgss);
        tr[k].gss=max(max(tr[lc].gss,tr[rc].gss),tr[lc].rgss+tr[rc].lgss);
    }
    void build(int k,int l,int r){
        if(l==r){
            tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=a[l];
            return ;
        }
        int mid=l+r>>1;
        build(lc,l,mid);
        build(rc,mid+1,r);
        updata(k);
    }
    sgt query(int k,int l,int r,int x,int y){
        if(l==x&&r==y) return tr[k];
        int mid=l+r>>1;
        if(y<=mid) return query(lc,l,mid,x,y);
        else if(x>mid) return query(rc,mid+1,r,x,y);
        else{
            sgt left,right,result;
            left=query(lc,l,mid,x,mid);
            right=query(rc,mid+1,r,mid+1,y);
            result.sum=left.sum+right.sum;
            result.lgss=max(left.lgss,left.sum+right.lgss);
            result.rgss=max(right.rgss,right.sum+left.rgss);
            result.gss=max(max(left.gss,right.gss),left.rgss+right.lgss);
            return result;
        } 
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        build(1,1,n);
        scanf("%d",&m);
        for(int i=1,x,y;i<=m;i++){
            scanf("%d%d",&x,&y);
            printf("%d
    ",query(1,1,n,x,y).gss);
        }
        return 0;
    }

    GSS3

    #include<cstdio>
    #include<iostream>
    #define lc k<<1
    #define rc k<<1|1
    using namespace std;
    const int M=1e5+5,N=M<<2;
    struct sgtment{
        int sum,gss,lgss,rgss;
    }tr[N];
    int n,m,a[N];
    void updata(int k){
        tr[k].sum=tr[lc].sum+tr[rc].sum;
        tr[k].lgss=max(tr[lc].lgss,tr[lc].sum+tr[rc].lgss);
        tr[k].rgss=max(tr[rc].rgss,tr[rc].sum+tr[lc].rgss);
        tr[k].gss=max(max(tr[lc].gss,tr[rc].gss),tr[lc].rgss+tr[rc].lgss);
    }
    void build(int k,int l,int r){
        if(l==r){
            tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=a[l];
            return ;
        }
        int mid=l+r>>1;
        build(lc,l,mid);
        build(rc,mid+1,r);
        updata(k);
    }
    void change(int k,int l,int r,int pos,int val){
        if(l==r){
            tr[k].sum=tr[k].gss=tr[k].lgss=tr[k].rgss=val;
            return ;
        }
        int mid=l+r>>1;
        if(pos<=mid) change(lc,l,mid,pos,val);
        else change(rc,mid+1,r,pos,val);
        updata(k);
    }
    sgtment query(int k,int l,int r,int x,int y){
        if(l==x&&r==y) return tr[k];
        int mid=l+r>>1;
        if(y<=mid) return query(lc,l,mid,x,y);
        else if(x>mid) return query(rc,mid+1,r,x,y);
        else{
            sgtment left,right,result;
            left=query(lc,l,mid,x,mid);
            right=query(rc,mid+1,r,mid+1,y);
            result.sum=left.sum+right.sum;
            result.lgss=max(left.lgss,left.sum+right.lgss);
            result.rgss=max(right.rgss,right.sum+left.rgss);
            result.gss=max(max(left.gss,right.gss),left.rgss+right.lgss);
            return result;
        } 
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        build(1,1,n);
        scanf("%d",&m);
        for(int i=1,opt,x,y;i<=m;i++){
            scanf("%d%d%d",&opt,&x,&y);
            if(opt) printf("%d
    ",query(1,1,n,x,y).gss);
            else change(1,1,n,x,y);
        }
        return 0;
    }
  • 相关阅读:
    C++ 17
    C++ 11
    mysql统计某一个数据库中有几张表
    poj2636---Electrical Outlets(插线板)
    poj2608---几个字母映射到同一个数字
    poj2583---Series Determination
    poj2578---三个数中找出第一个大于168的
    poj2521---lose money
    poj2538---字符匹配(映射)
    poj2509---抽k根烟就换一支,求能抽烟的总数
  • 原文地址:https://www.cnblogs.com/shenben/p/6361623.html
Copyright © 2011-2022 走看看