BZOJ4590 SHOI2015自动刷题机(二分答案)
2024-08-26 08:08:22
二分答案,分别往尽量小的和尽量大的二分即可。
#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 ;
}
最新文章
- python使用pdkdf2加盐密码
- 从.NET平台调用Win32 API
- Linux安装gcc编译器详解
- github优秀开源项目大全-iOS
- IIS Express简介
- [CFGym101061G] Repeat it(逆元)
- ehcache版本冲突
- SecureCRT, SecureFX连接Linux时中文乱码解决办法
- IP数据报是如何在网络中转发的?
- abstract class 与interface
- Dubbo应用文档
- Oracle execute and call
- PHP性能优化利器:生成器 yield理解
- nrf52832-定时器例程
- webservice 生成客户端代码
- nusaop 关于webService
- VS中生成时“sgen.exe”已退出,代码为 1解决办法
- vue2.0 slot用法
- Dos命令下目录操作
- web02-welcomeyou
热门文章
- Ganglia监控安装配置
- ASP.NET HttpHandler加水印
- 使用mysql5.7版本数据库需要注意的地方/持续更新
- 解决软件启动报error while loading shared libraries: libgd.so.2: cannot open shared object错误
- 来自一个大三开学三周的huster的迷茫与失措
- POJ1679(次小生成树)
- 【转】Linux系统安装Redis详细过程
- Java——英文字母---18.10.11
- JAVA大作业汇总1
- 1394-Minimum Inversion Number