zoukankan      html  css  js  c++  java
  • uva 1400

    好题。

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 using namespace std;
      5 int CASE=1;
      6 const int maxn=500000+5;
      7 typedef long long LL;
      8 typedef  pair<int,int> Interval;
      9 int qL,qR;
     10 LL s[maxn];
     11 Interval max_sub[maxn<<1];
     12 LL max_prefix[maxn<<1];
     13 LL max_suffix[maxn<<1];
     14 LL sum(int l,int r)
     15 {
     16     return s[r]-s[l-1];
     17 }
     18 LL sum(Interval x)
     19 {
     20     return s[x.second]-s[x.first-1];
     21 }
     22 Interval better(Interval a,Interval b)
     23 {
     24     if(sum(a)==sum(b)) return a<b?a:b;
     25     else return sum(a)>sum(b)?a:b;
     26 }
     27 void build(int l,int r,int rt)
     28 {
     29    if(l==r)
     30    {
     31      max_prefix[rt]=max_suffix[rt]=l;
     32      max_sub[rt]=make_pair(l,l);
     33      return ;
     34    }
     35    else
     36    {
     37     int m=l+(r-l)/2;
     38     build(l,m,rt<<1);
     39     build(m+1,r,rt<<1|1);
     40 
     41     LL v1=sum(l,max_prefix[rt<<1]);
     42     LL v2=sum(l,max_prefix[rt<<1|1]);
     43     if(v1==v2) max_prefix[rt]=min(max_prefix[rt<<1],max_prefix[rt<<1|1]);
     44     else  max_prefix[rt]=v1>v2?max_prefix[rt<<1]:max_prefix[rt<<1|1];
     45 
     46     v1=sum(max_suffix[rt<<1],r);
     47     v2=sum(max_suffix[rt<<1|1],r);
     48     if(v1==v2) max_suffix[rt]=min(max_suffix[rt<<1],max_suffix[rt<<1|1]);
     49     else  max_suffix[rt]=v1>v2?max_suffix[rt<<1]:max_suffix[rt<<1|1];
     50 
     51     max_sub[rt]=better(max_sub[rt<<1],max_sub[rt<<1|1]);
     52     max_sub[rt]=better(max_sub[rt],make_pair(max_suffix[rt<<1],max_prefix[rt<<1|1]));
     53    }
     54 }
     55 Interval prefix_query(int l,int r,int rt)
     56 {
     57     if(max_prefix[rt]<=qR) return make_pair(l,max_prefix[rt]);
     58     int m=l+(r-l)/2;
     59     if(qR<=m) return prefix_query(l,m,rt<<1);
     60     Interval i=prefix_query(m+1,r,rt<<1|1);
     61     i.first=l;
     62     return better(i,make_pair(l,max_prefix[rt<<1]));
     63 }
     64 Interval suffix_query(int l,int r,int rt)
     65 {
     66     if(max_suffix[rt]>=qL) return make_pair(max_suffix[rt],r);
     67     int m=l+(r-l)/2;
     68     if(qL>m) return suffix_query(m+1,r,rt<<1|1);
     69     Interval i=suffix_query(l,m,rt<<1);
     70     i.second=r;
     71     return better(i,make_pair(max_suffix[rt<<1|1],r));
     72 }
     73 Interval query(int l,int r,int rt)
     74 {
     75     if(qL<=l&&r<=qR)
     76       return max_sub[rt];
     77     int m=l+(r-l)/2;
     78     if(qR<=m) return query(l,m,rt<<1);
     79     if(qL>m) return query(m+1,r,rt<<1|1);
     80     Interval i1=suffix_query(l,m,rt<<1);
     81     Interval i2=prefix_query(m+1,r,rt<<1|1);
     82     Interval i3=better(query(l,m,rt<<1),query(m+1,r,rt<<1|1));
     83     return better(i3,make_pair(i1.first,i2.second));
     84 }
     85 int main()
     86 {
     87     int n,m;
     88     while(scanf("%d%d",&n,&m)!=EOF)
     89     {
     90         int a;
     91         s[0]=0;
     92        for(int i=1;i<=n;i++)
     93         {
     94             scanf("%d",&a);
     95             s[i]=s[i-1]+a;
     96         }
     97         build(1,n,1);
     98        printf("Case %d:
    ",CASE++);
     99        while(m--)
    100        {
    101            int a,b;
    102            scanf("%d%d",&a,&b);
    103            qL=a,qR=b;
    104            Interval ans=query(1,n,1);
    105 
    106            printf("%d %d
    ",ans.first,ans.second);
    107        }
    108     }
    109     return 0;
    110 }
  • 相关阅读:
    怎么判断一个bug到底是前端的bug还是后端的bug
    charles抓包原理
    java基础|Properties文件解析
    java基础|break、continue和return
    Java使用JSONPath解析JSON完整内容详解
    10/23/2019
    有什么好怕的
    [转]一个急刹车,过路老人吓得病发身亡 司机要担责吗?
    [转]7岁女孩练舞下腰致残,舞蹈培训机构被判赔115万
    Salesforce权限管理
  • 原文地址:https://www.cnblogs.com/sooflow/p/3280193.html
Copyright © 2011-2022 走看看