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 #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 }