无修改区间查询 BNU Can you answer these queries I

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 
  5 using namespace std;
  6 
  7 int an[50010];
  8 int get[50010];
  9 struct Node
 10 {
 11     int l,r;
 12     int lmax,rmax,ma;
 13     int sum;
 14 }bn[200000];
 15 
 16 void build(int k,int l,int r)
 17 {
 18     bn[k].l=l;
 19     bn[k].r=r;
 20     bn[k].sum=get[r]-get[l-1];
 21     if(l==r)
 22     {
 23         bn[k].ma=an[l];
 24         bn[k].lmax=an[l];
 25         bn[k].rmax=an[l];
 26         return ;
 27     }
 28     int lk=k*2;
 29     int rk=lk+1;
 30     int mid=(l+r)/2;
 31     build(lk,l,mid);
 32     build(rk,mid+1,r);
 33     bn[k].lmax=max(bn[lk].lmax,bn[lk].sum+bn[rk].lmax);
 34     bn[k].rmax=max(bn[rk].rmax,bn[rk].sum+bn[lk].rmax);
 35     bn[k].ma=max(bn[k].lmax,bn[k].rmax);
 36     bn[k].ma=max(bn[k].ma,bn[lk].ma);
 37     bn[k].ma=max(bn[k].ma,bn[rk].ma);
 38     bn[k].ma=max(bn[k].ma,bn[lk].rmax+bn[rk].lmax);
 39     bn[k].sum=bn[lk].sum+bn[rk].sum;
 40 }
 41 
 42 Node search(int k,int l,int r)
 43 {
 44     if(bn[k].l==l&&bn[k].r==r)
 45     {
 46  //       cout<<"l"<<l<<"r"<<r<<endl;
 47  //       cout<<bn[k].ma<<" "<<bn[k].sum<<" "<<bn[k].lmax<<" "<<bn[k].rmax<<endl;
 48         return bn[k];
 49     }
 50     int lk=k*2;
 51     int rk=lk+1;
 52     if(bn[lk].r>=r)
 53     {
 54   //      cout<<"kk2"<<endl;
 55         return search(lk,l,r);
 56     }
 57     else if(bn[rk].l<=l)
 58     {
 59   //      cout<<"kk1"<<endl;
 60         return search(rk,l,r);
 61     }
 62     else
 63     {
 64  //       cout<<"kk"<<endl;
 65         Node a=search(lk,l,bn[lk].r);
 66         Node b=search(rk,bn[rk].l,r);
 67         Node ret;
 68         ret.sum=a.sum+b.sum;
 69         ret.lmax=max(a.lmax,a.sum+b.lmax);
 70         ret.rmax=max(b.rmax,b.sum+a.rmax);
 71         ret.ma=max(ret.lmax,ret.rmax);
 72         ret.ma=max(ret.ma,b.ma);
 73         ret.ma=max(ret.ma,a.ma);
 74         ret.ma=max(ret.ma,a.rmax+b.lmax);
 75  //       cout<<"s"<<a.lmax<<" "<<a.rmax<<" "<<a.ma<<" "<<a.sum<<endl;
 76         return ret;
 77     }
 78 }
 79 
 80 int main()
 81 {
 82     int n;
 83     while(scanf("%d",&n)!=EOF)
 84     {
 85         memset(an,0,sizeof(an));
 86         memset(get,0,sizeof(get));
 87         for(int i=1;i<=n;i++)
 88         {
 89             scanf("%d",&an[i]);
 90         }
 91         for(int i=1;i<=n;i++)
 92         {
 93             get[i]=get[i-1]+an[i];
 94         }
 95         build(1,1,50010);
 96         int m;
 97         scanf("%d",&m);
 98         int a,b;
 99         for(int i=0;i<m;i++)
100         {
101             scanf("%d%d",&a,&b);
102             printf("%d
",search(1,a,b).ma);
103         }
104     }
105     return 0;
106 }
View Code
原文地址:https://www.cnblogs.com/wsruning/p/4691428.html