标签:
二分答案+验证
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int N,M,K,A; int p[200000+10],a[200000+10]; int Num(int B,int A) { return (B+1)/(A+1); } int main() { while(~scanf("%d%d%d",&N,&K,&A)){ scanf("%d",&M); memset(p,0,sizeof p); for(int i=1;i<=M;i++) scanf("%d",&p[i]); memset(a,0,sizeof a); a[N+1]=1; int min=0,max=M+1; int mid=(min+max)/2; int pre=0; while(1) { if(mid>=pre) { for(int i=pre;i<=mid;i++) a[p[i]]=1; pre=mid; int len=0; int tot=0; for(int i=1;i<=N+1;i++) { if(a[i]==1) { tot=tot+Num(len,A); len=0; } else len++; } if(tot>=K) min=mid+1; else max=mid; mid=(min+max)/2; } else { for(int i=pre;i>mid;i--) a[p[i]]=0; pre=mid; int len=0; int tot=0; for(int i=1;i<=N+1;i++) { if(a[i]==1) { tot=tot+Num(len,A); len=0; } else len++; } if(tot>=K) min=mid+1; else max=mid; mid=(min+max)/2; } if(min==max) break; } if(mid==M+1) printf("-1\n"); else printf("%d\n",mid); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zufezzt/p/4857589.html