题目链接: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代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+;
int n,k,a,m; struct _BIT
{
int N,C[maxn];
#define lowbit(x) (x&(-x))
void init(int n) //初始化共有n个点
{
N=n;
for(int i=;i<=N;i++) C[i]=;
}
void add(int pos,int val) //在pos点加上val
{
while(pos<=N)
{
C[pos]+=val;
pos+=lowbit(pos);
}
}
int ask(int pos) //查询1~pos点的和
{
int ret=;
while(pos>)
{
ret+=C[pos];
pos-=lowbit(pos);
}
return ret;
}
}BIT; int lower(int x)
{
int l=, r=BIT.N;
while(l<r)
{
int mid=(l+r)>>;
if(BIT.ask(mid)<x) l=mid+;
else r=mid;
}
return l;
} int upper(int x)
{
int l=, r=BIT.N;
while(l<r)
{
int mid=(l+r)>>;
if(BIT.ask(mid)<=x) l=mid+;
else r=mid;
}
return l;
} int main()
{
cin>>n>>k>>a>>m; BIT.init(n+);
BIT.add(,), BIT.add(n+,);
int cur=(n+)/(a+);
for(int i=,x;i<=m;i++)
{
scanf("%d",&x), x++; int tp=BIT.ask(x);
int l=lower(tp), r=upper(tp);
int old=(r-l)/(a+);
int now=(r-x)/(a+)+(x-l)/(a+);
cur-=old-now; if(cur<k)
{
printf("%d\n",i);
return ;
} BIT.add(x,);
}
printf("-1\n");
}

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. 【Aizu - 0189】Convenient Location (最短路 Floyd算法)

    Convenient Location 直接翻译了 Descriptions 明年毕业的A为就业而搬家.就职的公司在若干城市都有办公室,不同天出勤的办公室也不同.所以A在考虑住在哪去各个办公室的时长最 ...

  2. 适合长期英语学习的电视、电台、podcast节目有哪些?

    1.Stuff You Should Know 非常有名的一个节目 直接在度娘搜索第一个就是官网,里面有videos和podcasts两种 Postcasts有特别多种类的主题, 每期介绍一个主题, ...

  3. 简单谈一谈Java内部类的使用原因

    使用内部类的原因 学习总得知其所以然,前面的一篇文章中我有提到过关于java内部类的几种用法以及一些示例,但是不明白内部类具体可以做什么,显然学习起来很渺茫,今天的文章简单说一说使用内部类的几个原因, ...

  4. Tcp问题汇总

    一 TCP三次握手 PS:TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』.不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据. 起初,服务器和客户端都为CLOS ...

  5. java源码--Map

    Map接口 用于保存具有映射关系的数据结构,实现该接口的类可以通过键来获取对应的值.. 可以将给定一个键值对存储在Map接口的实现类实例中,如:map.put("key", &qu ...

  6. COleVariant类

    COleVariant本质上是一个枚举,用同一种类型来表达不同的子类型.如同boost中的variant. COLeVariant类是对VARIANT结构的封装. VARIANT结构包含两部分.其一是 ...

  7. PAT甲级 图的遍历 相关题_C++题解

    图的遍历 PAT (Advanced Level) Practice 图的遍历 相关题 目录 <算法笔记>重点摘要 1021 Deepest Root (25) 1076 Forwards ...

  8. python学习-42 装饰器 --- 函数闭包1

    函数闭包举例: def father(name): print('hello world') def son(): print('儿子说:我的爸爸是%s' % name) def grandfson( ...

  9. 更改CodeBlocks注释的颜色

  10. mac OS 安装qt环境

    先安装xcode,然后从官网下载dmg安装包安装即可,这里主要出现一个问题就是创建的工程没法编译,提示没有构建包(kit) 要安装command line tool才行. 在命令行中输入: xcode ...