codeforces 567D 二分

末蓝、 2022-08-04 05:09 264阅读 0赞

满足二分的条件,如果当前的断点不符合条件,那么后面的一定不符合条件,如果当前的符合条件,那么后面的可能还有符合条件的。

二分的过程中对断点进行排序,判断每个区间能放多少船只,总和加起来,判断是不是小于k。

  1. #include<bitset>
  2. #include<map>
  3. #include<vector>
  4. #include<cstdio>
  5. #include<iostream>
  6. #include<cstring>
  7. #include<string>
  8. #include<algorithm>
  9. #include<cmath>
  10. #include<stack>
  11. #include<queue>
  12. #include<set>
  13. #define inf 0x3f3f3f3f
  14. #define mem(a,x) memset(a,x,sizeof(a))
  15. using namespace std;
  16. typedef long long ll;
  17. typedef pair<int,int> pii;
  18. inline int in()
  19. {
  20. int res=0;
  21. char c;
  22. while((c=getchar())<'0' || c>'9');
  23. while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
  24. return res;
  25. }
  26. int n,m,a,k;
  27. int x[200020];
  28. int xx[200020];
  29. bool check(int t)
  30. {
  31. ll res=0;
  32. memcpy(xx,x,sizeof(int)*(t+1));
  33. xx[0]=0,xx[t+1]=n+1;
  34. sort(xx,xx+t+2);
  35. for(int i=1;i<=t+1;i++)
  36. {
  37. if(xx[i]-xx[i-1]-1>=a) res+=(xx[i]-xx[i-1])/(a+1);
  38. }
  39. return res>=k;
  40. }
  41. int main()
  42. {
  43. n=in(),k=in(),a=in();
  44. m=in();
  45. for(int i=1;i<=m;i++)
  46. {
  47. x[i]=in();
  48. }
  49. int l=1,r=m;
  50. while(l<=r)
  51. {
  52. int mid=(l+r)>>1;
  53. if(check(mid))
  54. {
  55. l=mid+1;
  56. }
  57. else r=mid-1;
  58. }
  59. printf("%d\n",l==m+1?-1:l);
  60. return 0;
  61. }

发表评论

表情:
评论列表 (有 0 条评论,264人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CodeForces1214D

    [CodeForces1214D][] 这个题据我所知有两种比较优秀的做法. 第一种是\\(DP\\)统计每个点的路径数,然后找出必经点,再从必经点开始\\(bfs\\

    相关 CodeForces1208D

    CodeForces1208D 也是挺吓人的一道题,我一开始以为给的是每个数字前比它小的数字有几个,然后我就苦苦看不懂样例... 然后我冷静了一下,重新分析,读题,发现

    相关 codeforces 567C

    mp2存放每个数当中间的数的次数,对每个数,如果有a\[i\]%k==0,那么ans就加上mp2\[a\[i\]/k\],mp表示这个数当第一个数的次数,对每个数,如果有a\[

    相关 codeforces 567D

    满足二分的条件,如果当前的断点不符合条件,那么后面的一定不符合条件,如果当前的符合条件,那么后面的可能还有符合条件的。 二分的过程中对断点进行排序,判断每个区间能放多少

    相关 Codeforces 496D

    题意 -------------------- 进行若干场比赛,每次比赛两人对决,赢的人得到1分,输的人不得分,先得到t分的人获胜,开始下场比赛,某个人率先赢下s场比赛