zoukankan      html  css  js  c++  java
  • 无修改区间查询 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
  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/wsruning/p/4691428.html
Copyright © 2011-2022 走看看