取最大值以及最小值就看你的等号在哪个地方取最大值的话,如果此时已经相等那么就往右边,取最小值得话相等就往左边,
其它得就是稍微变形了一下
#include <iostream>
#include <cstdio>
#include <cstring>
long long n,k,x[999910];
using namespace std;
long long check(long long mid)
{
long long cnt=0;
long long num=0;
for(int i=1;i<=n;i++)
{
num+=x[i];
if(num>=mid)
{
cnt++;
num=0;
}
else if(num<0)
{
num=0;
}
}
return cnt;
}
int main()
{
long long ans=-1;
scanf("%lld%lld",&n,&k);
long long mx=-1;
for(long long i=1;i<=n;i++)
{
scanf("%lld",&x[i]);
}
long long l=1,r=99999999999;
while(l<=r)
{
long long mid=(l+r)/2;
if(check(mid)<=k)
{
r=mid-1;
if(check(mid)==k)
ans=mid;
}
else
{
l=mid+1;
}
}
if(ans==-1)
{
printf("-1");return 0;
}
printf("%lld ",ans);
l=1,r=99999999999;
while(l<=r)
{
long long mid=(l+r)/2;
if(check(mid)>=k)
{
l=mid+1;
if(check(mid)==k)
ans=mid;
}
else
{
r=mid-1;
}
}
printf("%lld\n",ans);
}