Educational Codeforces Round 28 C. Four Segments

题意:给出一个数列,让我们求res和delom0(i),delim1(j),delim2(k)

其中sum(i,j)=a[i]+.......a[j-1]  ,所以sum(i,i)=0;

思路:我们正的枚举(i,j)的位置,处理出某个j对于任意i的最大值,反的枚举(j,k)的位置,处理出某个j对于任意k的最大值

    最后我们枚举j的位置,MAX=max(Max,  d[j]+e[j+1]);当然在处理过程种得存i,j,k的位置

  1.  1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 
     5 ll a[5002];
     6 ll l[5002],r[5002];
     7 ll d[5002],e[5002];
     8 
     9 map<int ,pair<int,int > > ma,mb;
    10 int main(){
    11     int n;
    12     cin>>n;
    13     for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    14     for(int i=1;i<=n;i++) l[i]=a[i]+l[i-1];
    15     for(int i=n;i>=1;i--) r[i]=a[i]+r[i+1];
    16     ll xx,yy;
    17     for(int i=0;i<=n;i++)
    18     for(int j=i;j<=n;j++){
    19         if(i==j) xx=l[i];
    20         else xx=l[i]-(l[j]-l[i]);
    21         if(d[j]<xx){
    22             d[j]=xx;
    23             ma[j]=make_pair(j,i);
    24         }
    25     }
    26     for(int i=n+1;i>=1;i--){
    27         for(int j=i;j>=1;j--){
    28             if(i==j) yy=r[i];
    29             else yy=-r[i]+(r[j]-r[i]);
    30             if(e[j]<yy){
    31                 e[j]=yy;
    32                 mb[j]=make_pair(j,i);
    33             }
    34 
    35         }
    36     }
    37     ll Max=-1e18;
    38     int y;
    39     for(int i=0;i<=n;i++){
    40         if(d[i]+e[i+1]>Max){
    41             y=i;
    42             Max=d[i]+e[i+1];
    43         }
    44     }
    45     cout<<ma[y].second<<" "<<y<<" "<<max(min(mb[y+1].second-1,n),y)<<endl;
    46 }

     

 

posted on 2017-09-08 14:52  hhhhx  阅读(106)  评论(0编辑  收藏  举报

导航