FOJ 2203 单纵大法好

时间:2024-06-30 14:06:26

二分答案+验证

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; int N,M,K,A;
int p[+],a[+]; int Num(int B,int A)
{
return (B+)/(A+);
} int main()
{
while(~scanf("%d%d%d",&N,&K,&A)){
scanf("%d",&M);
memset(p,,sizeof p);
for(int i=;i<=M;i++) scanf("%d",&p[i]); memset(a,,sizeof a);
a[N+]=; int min=,max=M+;
int mid=(min+max)/;
int pre=; while()
{
if(mid>=pre)
{
for(int i=pre;i<=mid;i++) a[p[i]]=;
pre=mid;
int len=;
int tot=;
for(int i=;i<=N+;i++)
{
if(a[i]==)
{
tot=tot+Num(len,A);
len=;
}
else len++;
} if(tot>=K) min=mid+;
else max=mid; mid=(min+max)/; } else
{
for(int i=pre;i>mid;i--) a[p[i]]=;
pre=mid;
int len=;
int tot=;
for(int i=;i<=N+;i++)
{
if(a[i]==)
{
tot=tot+Num(len,A);
len=;
}
else len++;
} if(tot>=K) min=mid+;
else max=mid; mid=(min+max)/;
}
if(min==max) break;
}
if(mid==M+) printf("-1\n");
else printf("%d\n",mid);
}
return ;
}