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
  • 相关阅读:
    反悔贪心 学习笔记
    「CF901C」Bipartite Segments 题解
    「HEOI2015」公约数数列 题解
    拓展欧拉定理
    莫比乌斯反演题目选做
    八月水题录
    chapt15、使用虚拟内存
    chapt16、线程堆栈
    chapt14、探索虚拟内存
    get files version by vbs
  • 原文地址:https://www.cnblogs.com/wsruning/p/4691428.html
Copyright © 2011-2022 走看看