Description
曾经发明了信号增幅仪的发明家
SHTSC
又公开了他的新发明:自动刷题机–一种可以自动
AC
题目的神秘装置。自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序,每秒,自动刷题机的代码生成模块会有两种可能的结果:
A.写了
x
行代码。
B.心情不好,删掉了之前写的
对于每个
Input
第一行两个整数
l,k
,表示刷题机的日志一共有
l
行,一共了切了
第二行
l
个整数,
1<=l,k<=100000,|xi|<=109
Output
输出两个数
a,b
。分别代表
n
可能的最小值和最大值。如果不存在这样的
Solution
这题目看过去就知道是二分(源自去年 NOIP 跳石头掉水的惨痛经历)
如果
n
小不会比
(窝写这题卡细节卡了好多次,太弱啦QAQ)
#include<stdio.h>
#define N 100005
typedef long long ll;
int a[N],n,k,t;
ll l,r,mid,tot;
inline int judge(const ll &p)
{
ll now=0;int sum=0;
for (int i=0;i<n;i++)
{
now+=a[i];
if (now>=p) sum++,now=0;
if (now<0) now=0;
}
return sum;
}
int main()
{
scanf("%d%d",&n,&k);
for (int i=0;i<n;i++) scanf("%d",a+i),tot+=(a[i]>0)?a[i]:1,t+=(a[i]>0);
if (t<k){puts("-1");return 0;}
for (l=1,r=tot,mid=(l+r)>>1;l<r;mid=(l+r+1)>>1) if (judge(mid)<k) r=mid-1;
else l=mid;
ll a2=l;
for (l=1,r=tot,mid=(l+r)>>1;l<r;mid=(l+r)>>1) if (judge(mid)>k) l=mid+1;
else r=mid;
ll a1=l;
if (judge(a1)!=k || judge(a2)!=k) puts("-1");
else printf("%lld %lld",a1,a2);
}