ARC-100 D - Equal Cut

题面在这里!

 

    我们枚举一下第2和第3段的分界点,显然这种情况下 第1与第2  和  第3与第4  之间的分界点都只有两种情况可能最优,吧这四种情况讨论一下就好了。

    两边的分界点可以单调扫过去。。。

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#define ll long long
using namespace std;
const int N=200005;

inline int read(){
	int x=0; char ch=getchar();
	for(;!isdigit(ch);ch=getchar());
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
	return x;
}

int n,px,py;
ll a[N],ans=1e18,tot,now,mx,mn;

inline void update(){
	if(now<mn) mn=now;
	else if(now>mx) mx=now; 
}

inline void solve(){
	for(int i=1;i<=n;i++){
		while(px<i&&a[px+1]*2ll<=a[i]) px++;
		while(py<n&&a[py+1]*2ll<=tot+a[i]) py++;
		
		for(int u=px+1;u>=px;u--)
		    for(int v=py+1;v>=py;v--){
		        mx=mn=a[u];
		    	
		    	now=a[i]-a[u],update();
		    	now=a[v]-a[i],update();
		    	now=tot-a[v],update();
		    	
		    	ans=min(ans,mx-mn);
			}
	}
}

int main(){
	n=read();
	for(int i=1;i<=n;i++) a[i]=a[i-1]+(ll)read();
	a[n+1]=a[n+2]=tot=a[n];
	solve(),printf("%lld\n",ans);
	return 0;
}

 

posted @ 2018-07-02 11:53  蒟蒻JHY  阅读(303)  评论(0编辑  收藏  举报