.
题意:有一个自动刷题机每秒可以打$x_i$行代码($x_i<0$表示删除),假如每一秒末总行数超过了n,就可以a一题并删掉所有代码。给出x和ac题数,求n。
题解:二分。(本来想用equal_range的,结果发现太大,用不了。。。)
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100010];
int chk(long long x)
{
long long now=0;
int ans=0;
for(int i=1;i<=n;i++)
{
now+=a[i];
now=max(now,0LL);
if(now>=x)
{
ans++;
now=0;
}
}
// printf("%lld %d\n",x,ans);
return ans;
}
long long getl()
{
long long l=1,len=1e14;
while(len)
{
long long md=l+(len>>1);
if(chk(md)>m)
{
l=md+1;
len=len-(len>>1)-1;
}
else
len>>=1;
}
return l;
}
long long getr()
{
long long l=1,len=1e14;
while(len)
{
long long md=l+(len>>1);
if(chk(md)>=m)
{
l=md+1;
len=len-(len>>1)-1;
}
else
len>>=1;
}
return l;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
long long l=getl(),r=getr();
if(l>=r)
puts("-1");
else
printf("%lld %lld\n",l,r-1);
}