二分答案,分别往尽量小的和尽量大的二分即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
#define inf 100000000000000ll
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int n,m,a[N];
int calc(ll k)
{
ll x=;int cnt=;
for (int i=;i<=n;i++)
{
x=max(0ll,x+a[i]);
if (x>=k) cnt++,x=;
}
return cnt;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4590.in","r",stdin);
freopen("bzoj4590.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++) a[i]=read();
ll l=,r=inf,ans=-;
while (l<=r)
{
ll mid=l+r>>;
if (calc(mid)<=m) ans=mid,r=mid-;
else l=mid+;
}
if (calc(ans)!=m) ans=-;
cout<<ans<<' ';
if (ans==-) return ;
l=,r=inf;
while (l<=r)
{
ll mid=l+r>>;
if (calc(mid)>=m) ans=mid,l=mid+;
else r=mid-;
}
cout<<ans;
return ;
}

最新文章

  1. python使用pdkdf2加盐密码
  2. 从.NET平台调用Win32 API
  3. Linux安装gcc编译器详解
  4. github优秀开源项目大全-iOS
  5. IIS Express简介
  6. [CFGym101061G] Repeat it(逆元)
  7. ehcache版本冲突
  8. SecureCRT, SecureFX连接Linux时中文乱码解决办法
  9. IP数据报是如何在网络中转发的?
  10. abstract class 与interface
  11. Dubbo应用文档
  12. Oracle execute and call
  13. PHP性能优化利器:生成器 yield理解
  14. nrf52832-定时器例程
  15. webservice 生成客户端代码
  16. nusaop 关于webService
  17. VS中生成时“sgen.exe”已退出,代码为 1解决办法
  18. vue2.0 slot用法
  19. Dos命令下目录操作
  20. web02-welcomeyou

热门文章

  1. Ganglia监控安装配置
  2. ASP.NET HttpHandler加水印
  3. 使用mysql5.7版本数据库需要注意的地方/持续更新
  4. 解决软件启动报error while loading shared libraries: libgd.so.2: cannot open shared object错误
  5. 来自一个大三开学三周的huster的迷茫与失措
  6. POJ1679(次小生成树)
  7. 【转】Linux系统安装Redis详细过程
  8. Java——英文字母---18.10.11
  9. JAVA大作业汇总1
  10. 1394-Minimum Inversion Number