用的二分,找不出tle的原因。
code:
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 110006
#define ll long long
using namespace std;
int read()
{
int ans=0;
char ch=getchar(),last=' ';
while(ch>'9'||ch<'0')last=ch,ch=getchar();
while(ch>='0'&&ch<='9')ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
return last=='-'?-ans:ans;
}
int n,k,a[N];
ll l,r;
int check(ll x)
{
ll sum=0,ans=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(sum<0)sum=0;
if(sum>=x)ans++,sum=0;
}
if(ans<k)return 2;//x大了
if(ans==k)return 1;
if(ans>k)return 0;//x小了
}
int main(){
n=read(),k=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
l=1;r=2147493647000000;
int jj=0;
while(l<r)
{
int mid=(ll)(l+r)>>1;
int judge=check(mid);
if(judge==1)r=mid,jj=1;
else if(!judge)l=mid+1;
else r=mid;
}
if(!jj)
{
printf("-1");
return 0;
}
printf("%lld ",l);
l=1;r=2147493647000000;
while(l<r)
{
ll mid=(ll)(l+r+1)>>1;
int judge=check(mid);
if(judge==1)l=mid,jj=1;
else if(!judge)l=mid;
else r=mid-1;
}
printf("%lld ",l);
return 0;
}