zoukankan      html  css  js  c++  java
  • GSS系列

    GSS1

    直接维护静态区间和即可

    #include<bits/stdc++.h>
    using namespace std;
    const int N=50005;
    int n,a[N];
    struct Seg_Tree{int lmax,rmax,dat,sum;}tr[N<<2];
    inline void pushup(int k){
        tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
        tr[k].lmax=max(tr[k<<1].lmax,tr[k<<1].sum+tr[k<<1|1].lmax);
        tr[k].rmax=max(tr[k<<1|1].rmax,tr[k<<1|1].sum+tr[k<<1].rmax);
        tr[k].dat=max(max(tr[k<<1].dat,tr[k<<1|1].dat),tr[k<<1].rmax+tr[k<<1|1].lmax);
    }
    inline void build(int k,int l,int r){
        if(l==r)return tr[k].lmax=tr[k].rmax=tr[k].dat=tr[k].sum=a[l],void();
        int mid=(l+r)>>1;
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        pushup(k);
    }
    inline Seg_Tree query(int k,int l,int r,int x,int y){
        if(x<=l&&r<=y)return tr[k];
        int mid=(l+r)>>1;
        if(x>mid)return query(k<<1|1,mid+1,r,x,y);
        if(y<=mid)return query(k<<1,l,mid,x,y);
        Seg_Tree a=query(k<<1,l,mid,x,y),b=query(k<<1|1,mid+1,r,x,y),ans;
        ans.sum=a.sum+b.sum;
        ans.lmax=max(a.lmax,a.sum+b.lmax);
        ans.rmax=max(b.rmax,b.sum+a.rmax);
        ans.dat=max(max(a.dat,b.dat),a.rmax+b.lmax);
        return ans;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
         scanf("%d",&a[i]);
        build(1,1,n);
        int q,l,r;
        scanf("%d",&q);
        while(q--){
            scanf("%d%d",&l,&r);
            printf("%d
    ",query(1,1,n,l,r).dat); 
        }
    }

    GSS3

    加入单点查询就好了

    #include<bits/stdc++.h>
    using namespace std;
    const int N=50005;
    int n,a[N];
    struct Seg_Tree{int lmax,rmax,dat,sum;}tr[N<<2];
    inline void pushup(int k){
        tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
        tr[k].lmax=max(tr[k<<1].lmax,tr[k<<1].sum+tr[k<<1|1].lmax);
        tr[k].rmax=max(tr[k<<1|1].rmax,tr[k<<1|1].sum+tr[k<<1].rmax);
        tr[k].dat=max(max(tr[k<<1].dat,tr[k<<1|1].dat),tr[k<<1].rmax+tr[k<<1|1].lmax);
    }
    inline void build(int k,int l,int r){
        if(l==r)return tr[k].lmax=tr[k].rmax=tr[k].dat=tr[k].sum=a[l],void();
        int mid=(l+r)>>1;
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        pushup(k);
    }
    inline Seg_Tree query(int k,int l,int r,int x,int y){
        if(x<=l&&r<=y)return tr[k];
        int mid=(l+r)>>1;
        if(x>mid)return query(k<<1|1,mid+1,r,x,y);
        if(y<=mid)return query(k<<1,l,mid,x,y);
        Seg_Tree a=query(k<<1,l,mid,x,y),b=query(k<<1|1,mid+1,r,x,y),ans;
        ans.sum=a.sum+b.sum;
        ans.lmax=max(a.lmax,a.sum+b.lmax);
        ans.rmax=max(b.rmax,b.sum+a.rmax);
        ans.dat=max(max(a.dat,b.dat),a.rmax+b.lmax);
        return ans;
    }
    inline void change(int k,int l,int r,int x,int v){
        if(x>r||x<l)return;
        if(l==r&&l==x)return tr[k].lmax=tr[k].rmax=tr[k].dat=tr[k].sum=v,void();
        int mid=(l+r)>>1;
        change(k<<1,l,mid,x,v);
        change(k<<1|1,mid+1,r,x,v);
        pushup(k);
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
         scanf("%d",&a[i]);
        build(1,1,n);
        int q,t,l,r;
        scanf("%d",&q);
        while(q--){
            scanf("%d%d%d",&t,&l,&r);
            if(t)printf("%d
    ",query(1,1,n,l,r).dat); 
            else change(1,1,n,l,r);
        }
    }
  • 相关阅读:
    silverlight Prism4中文教程(第一章 第三部分)——bluesky234
    SilverLight学习笔记关于Silverlight资源文件(如:图片)的放置位置及其引用
    silverlight布局和式样中的常用三大控件 Canvas Grid StackPanel
    silverlight Prism4中文教程(第一章 第二部分)——bluesky234
    图文详解Silverlight用WCF访问MSSQL数据库(silverlight china)
    本人自写代码(Aspnetpager详细介绍)
    Asp.net 2.0 水晶报表部署问题解决
    VS2005中使用AspNetPager控件成功事例代码(分页超快的哟)
    AspNetPager不显示的N种可能性
    —(一)水晶报表(CrystalReports)的简单应用(配置及发布)
  • 原文地址:https://www.cnblogs.com/coder-cjh/p/11336657.html
Copyright © 2011-2022 走看看