题目链接:https://codeforces.com/problemset/problem/567/D

题意:

在一个 $1 \times n$ 的网格上,初始摆放着 $k$ 只船,每只船的长度均为 $a$ 个格子,已知所有船之间均不重叠、不触碰。

现在Bob每次询问Alice第 $i$ 个格子上是否存在船,Alice每次都会说不存在,求在第几次询问时,可以确定Alice撒谎了。

题解:

对于某次询问一个位置 $x$ 是否有船,假设其属于某个最小的区间 $(l,r)$,其中 $l,r$ 分别是曾经询问过的位置。我们用树状数组配合二分 $O(\log^2 n)$ 寻找出 $l,r$。

那么,可以计算出,$(l,r)$ 区间曾经最多能停放多少船只,而现在变成了两个区间 $(l,x)$ 和 $(x,r)$ 后,又能停放多少船只。

这样一来,最开始我们计算出整个区域 $(0,n+1)$ 最多放多少船只 $cur$,进而对每次计算都能计算出减少了多少船只,即 $cur$ 会减去一个数,直到某一次询问,使得 $cur<k$,即代表Alice撒谎了。

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=2e5+;
  4. int n,k,a,m;
  5.  
  6. struct _BIT
  7. {
  8. int N,C[maxn];
  9. #define lowbit(x) (x&(-x))
  10. void init(int n) //初始化共有n个点
  11. {
  12. N=n;
  13. for(int i=;i<=N;i++) C[i]=;
  14. }
  15. void add(int pos,int val) //在pos点加上val
  16. {
  17. while(pos<=N)
  18. {
  19. C[pos]+=val;
  20. pos+=lowbit(pos);
  21. }
  22. }
  23. int ask(int pos) //查询1~pos点的和
  24. {
  25. int ret=;
  26. while(pos>)
  27. {
  28. ret+=C[pos];
  29. pos-=lowbit(pos);
  30. }
  31. return ret;
  32. }
  33. }BIT;
  34.  
  35. int lower(int x)
  36. {
  37. int l=, r=BIT.N;
  38. while(l<r)
  39. {
  40. int mid=(l+r)>>;
  41. if(BIT.ask(mid)<x) l=mid+;
  42. else r=mid;
  43. }
  44. return l;
  45. }
  46.  
  47. int upper(int x)
  48. {
  49. int l=, r=BIT.N;
  50. while(l<r)
  51. {
  52. int mid=(l+r)>>;
  53. if(BIT.ask(mid)<=x) l=mid+;
  54. else r=mid;
  55. }
  56. return l;
  57. }
  58.  
  59. int main()
  60. {
  61. cin>>n>>k>>a>>m;
  62.  
  63. BIT.init(n+);
  64. BIT.add(,), BIT.add(n+,);
  65. int cur=(n+)/(a+);
  66. for(int i=,x;i<=m;i++)
  67. {
  68. scanf("%d",&x), x++;
  69.  
  70. int tp=BIT.ask(x);
  71. int l=lower(tp), r=upper(tp);
  72. int old=(r-l)/(a+);
  73. int now=(r-x)/(a+)+(x-l)/(a+);
  74. cur-=old-now;
  75.  
  76. if(cur<k)
  77. {
  78. printf("%d\n",i);
  79. return ;
  80. }
  81.  
  82. BIT.add(x,);
  83. }
  84. printf("-1\n");
  85. }

Codeforces 567D - One-Dimensional Battle Ships - [树状数组+二分]的更多相关文章

  1. POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

  2. TZOJ 4602 高桥和低桥(二分或树状数组+二分)

    描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...

  3. POJ 2182 Lost Cows 【树状数组+二分】

    题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  4. 树状数组+二分||线段树 HDOJ 5493 Queue

    题目传送门 题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法 分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], ...

  5. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  6. The Stream of Corning 2( 权值线段树/(树状数组+二分) )

    题意: 有两种操作:1.在[l,r]上插入一条值为val的线段 2.问p位置上值第k小的线段的值(是否存在) 特别的,询问的时候l和p合起来是一个递增序列 1<=l,r<=1e9:1< ...

  7. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  8. Educational Codeforces Round 10 D. Nested Segments (树状数组)

    题目链接:http://codeforces.com/problemset/problem/652/D 给你n个不同的区间,L或者R不会出现相同的数字,问你每一个区间包含多少个区间. 我是先把每个区间 ...

  9. Codeforces Gym 100114 H. Milestones 离线树状数组

    H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...

随机推荐

  1. Docker Machine(十五)

    目录 一.Docker Machine 总览 1.Docker Engine VS Docker Machine 2.环境准备 二.安装 Docker Machine 1.Install Machin ...

  2. SPSS 2019年10月31日 20:20:53今日学习总结

    ◆描述性统计分析 概念:描述性统计分析方法是指应用分类.制表.图形及概括性数据指标(去均值,方差等)来概括数据分布特征的方法. 而推断性统计分析方法则是通过随机抽样,应用统计方法把从样本数据得到的结论 ...

  3. 【VS开发】【C++开发】const在函数前与函数后的区别

    const在函数前与函数后的区别 一   const基础           如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:           int   b   =   ...

  4. 最新 花椒直播java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.花椒直播等10家互联网公司的校招Offer,因为某些自身原因最终选择了花椒直播.6.7月主要是做系统复习.项目复盘.Leet ...

  5. CenOS 7 java链接redis数据库

    完整代码 public class App { public static void main(String[] args) { System.out.println("Hello Worl ...

  6. Homebrew介绍和使用

    一.Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径 ...

  7. PHP解析xml的方法

    PHP解析xml的方法<pre><?php /** XML 文件分析类 * Date: 2013-02-01 * Author: fdipzone * Ver: 1.0 * * fu ...

  8. 终端、虚拟终端、shell、控制台、tty的区别

    终端与控制台的区别? 最近开始接触Linux,终端.虚拟终端.shell.控制台.tty等概念让我很混乱,有必要认识清楚. 今天看到有人问终端和控制台的区别,而且这个问题比较有普遍性,因此想抽出一点时 ...

  9. electron node.js 在 vscode 设置 调试 Debug

    在当前工程下,添加一个 .vscode/launch.json 文件 { // Use IntelliSense to learn about possible attributes. // Hove ...

  10. IO-file-04 文件的创建

    1. package com.bwie.io; import java.io.File; import java.io.IOException; public class FileDemo4 { /* ...