传送门

D. One-Dimensional Battle Ships
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Alice and Bob love playing one-dimensional battle ships. They play on the field in the form of a line consisting of n square cells (that is, on a 1 × n table).

At the beginning of the game Alice puts k ships on the field without telling their positions to Bob. Each ship looks as a 1 × a rectangle (that is, it occupies a sequence of a consecutive squares of the field). The ships cannot intersect and even touch each other.

After that Bob makes a sequence of "shots". He names cells of the field and Alice either says that the cell is empty ("miss"), or that the cell belongs to some ship ("hit").

But here's the problem! Alice like to cheat. May be that is why she responds to each Bob's move with a "miss".

Help Bob catch Alice cheating — find Bob's first move, such that after it you can be sure that Alice cheated.

Input

The first line of the input contains three integers: nk and a (1 ≤ n, k, a ≤ 2·105) — the size of the field, the number of the ships and the size of each ship. It is guaranteed that the nk and a are such that you can putk ships of size a on the field, so that no two ships intersect or touch each other.

The second line contains integer m (1 ≤ m ≤ n) — the number of Bob's moves.

The third line contains m distinct integers x1, x2, ..., xm, where xi is the number of the cell where Bob made the i-th shot. The cells are numbered from left to right from 1 to n.

Output

Print a single integer — the number of such Bob's first move, after which you can be sure that Alice lied. Bob's moves are numbered from 1 to m in the order the were made. If the sought move doesn't exist, then print "-1".

Sample test(s)
input
11 3 3
5
4 8 6 1 11
output
3
input
5 1 3
2
1 5
output
-1
input
5 1 3
1
3
output

1

--------------------------------------------------------------------------------------------------

比赛时很快想到解法,之后意识到要用线段树维护,但我对线段树还不是特别熟练,没写出来,想想十分可惜。

Solution

任意时刻Alice可以放置ship的地方是一些区间(线段)(active segments),我们设法维护这些区间,需支持下列操作:

1. 查询某个cell所在的区间

2. 将某个区间分成多个区间

根据Bob每次guess的结果维护Alice的active segments,计算出Alice当前最多能放几个ship,若果小于k,则可断言Alice说谎了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include<bits/stdc++.h>
using namespace std;
const int MAX_N=2e5+;
int tag[MAX_N<<];
int ma[MAX_N<<];
typedef pair<int,int> P;
P query(int id, int L, int R, int val){
if(tag[id]) return P(L, tag[id]);
int mid=(L+R)>>;
if(ma[id<<]>=val)
return query(id<<, L, mid, val);
return query(id<<|, mid+, R, val);
}
void insert(int id, int L, int R, int l, int r, int val){
if(l>r) return;
if(l<=L&&R<=r) tag[id]=ma[id]=val;
else{
int ls=id<<, rs=ls|, mid=(L+R)>>;
if(tag[id]){
tag[ls]=ma[rs]=tag[id]; //error-prone
tag[rs]=ma[rs]=tag[id];
tag[id]=;
}
if(l<=mid)
insert(ls, L, mid, l, r, val);
if(r>mid)
insert(rs, mid+, R, l, r, val);
ma[id]=max(ma[ls], ma[rs]);
}
}
int n, k, a, m, g, now;
int cap(int len){return (len+)/(a+);}
void init(){
scanf("%d%d%d%d", &n, &k, &a, &m);
tag[]=ma[]=n;
now=cap(n);
}
#define X first
#define Y second
int main(){
freopen("in", "r", stdin);
init();
P seg;
int ans=-;
for(int i=; i<=m; i++){
scanf("%d", &g);
//printf("g: %d\n", g);
seg=query(, , n, g);
//printf("%d %d\n", seg.X, seg.Y);
now-=cap(seg.Y-seg.X+);
now+=cap(g-seg.X);
now+=cap(seg.Y-g);
//printf("%d\n", now);
if(now<k){
ans=i;
break;
}
insert(, , n, seg.X, g-, g-);
insert(, , n, g, g, g);
}
printf("%d\n", ans);
}

P.S. 这道题再次写复杂了,我的解法是一种模拟解法,线段树只是起到加速的作用,并不是算法的核心。

我的算法是:模拟Bob的猜测过程,每猜一次就判断当前能否放得下k条船。但如果裸模拟的话可能会T。

这道题比较简单的解法是二分答案,然后再O(n)判断。

当时我完全没想到可O(n)判断,当然也没想到二分答案(这可是赤裸裸的二分答案题啊),

二分答案的复杂度是严格的O(n log m),我的写法的复杂度还依赖于答案的大小,最坏情况复杂度是O(m log n)。

——————————————————————————————————————————————————————

现在头脑越来越不灵了T^T。

Codeforces 567D One-Dimensional Battle Ships的更多相关文章

  1. Codeforces 567D:One-Dimensional Battle Ships(二分)

    time limit per test : 1 second memory limit per test : 256 megabytes input : standard input output : ...

  2. 【Codeforces 567D】One-Dimensional Battle Ships

    [链接] 我是链接,点我呀:) [题意] 长度为n的一个序列,其中有一些部分可能是空的,一些部分是长度为a的物品的一部分 (总共有k个长度为a的物品,一个放在位置i长度为a的物品会占据i,i+1,.. ...

  3. Codeforces Round #Pi (Div. 2) D. One-Dimensional Battle Ships set乱搞

    D. One-Dimensional Battle ShipsTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...

  4. Codeforces Round #Pi (Div. 2) D. One-Dimensional Battle Ships set区间分解

    D. One-Dimensional Battle ShipsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/co ...

  5. Codeforces Round #Pi (Div. 2) D. One-Dimensional Battle Ships

    Alice and Bob love playing one-dimensional battle ships. They play on the field in the form of a lin ...

  6. HDU5093——Battle ships(最大二分匹配)(2014上海邀请赛重现)

    Battle ships Problem DescriptionDear contestant, now you are an excellent navy commander, who is res ...

  7. [ZOJ 3623] Battle Ships

    Battle Ships Time Limit: 2 Seconds      Memory Limit: 65536 KB Battle Ships is a new game which is s ...

  8. HDOJ 5093 Battle ships 二分图匹配

    二分图匹配: 分别按行和列把图展开.hungary二分图匹配. ... 例子: 4 4 *ooo o### **#* ooo* 按行展开. .. . *ooo o#oo oo#o ooo# **#o ...

  9. Battle ships(二分图,建图,好题)

    Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

随机推荐

  1. python中的Unittest常用方法

    import unittest class SimpleUnitTest(unittest.TestCase): def test_Fail(self): self.failUnless(True) ...

  2. js中的return,return true,return false小结

    return  函数执行到这句时会终结,并返回调用函数,而且把表达式的值作为函数的结果返回 return false 可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转 ...

  3. Gradle命令行操作

    任务排除 gradle task1 -x task2 task2就是被排除的任务,同时task2依赖的任务也会被排除掉 守护进行执行 默认情况下,每次构建,都要启动一次JVM, gradle -dae ...

  4. [转]仿World Wind构造自己的C#版插件框架——WW插件机制精简改造

    很久没自己写东西啦,早该好好总结一下啦!一个大师说过“一个问题不应该被解决两次!”,除了一个好脑筋,再就是要坚持总结. 最近需要搞个系统的插件式框架,我参照World Wind的插件方式构建了个插件框 ...

  5. OAF TABLE中添加序号列

    在实际的OAF页面TABLE的使用中,会有很多时候需要在前台页面中显示序号,虽然在sql中可以使用rownum来获得序号,但是rounum的优先级比order by 高,所以在语句中order by ...

  6. H5实现拍照并上传

    <!DOCTYPE HTML><html><head>    <meta charset="UTF-8">    <meta ...

  7. C++创建对象的两种方式

    C++创建对象有两种方式,在栈上创建对象(Objects on the Stack)和在堆上创建对象(Objects on the Heap). 假设我们有以下的类: #include <str ...

  8. 技能获取与C语言学习情况

    你有什么技能比大多人(超过90%以上)更好? 仔细回想了一下自己到目前为止的学习生涯,好像真的没有什么技能能够比90%以上的人好. 初中高中学过很多东西,但是能够算得上专精的却着实没有.小学参加过计算 ...

  9. RxJava简介

    RxJava简介 本文为前段时间学习RxJava时留下的历史遗留笔记,仅作纪念,科学的大神教学帖子在这里-> 给 Android 开发者的 RxJava 详解 通过链式调用序列实现基于事件流的异 ...

  10. [软件测试]Linux环境中简单清爽的Google Test (GTest)测试环境搭建(初级使用)

    本文将介绍单元测试工具google test(GTEST)在linux操作系统中测试环境的搭建方法.本文属于google test使用的基础教程.在linux中使用google test之前,需要对如 ...