n²谁都会打,不说了。

这里讨论一下nlogn算法(单调不减):

首先开始考虑单调性,我习惯性的以为是单调队列/栈优化的那个套路,想要找到一个跟下标有关的单调性却发现没有。

例如:我想过当下标增加时f[i]增加,后来发现了反例:1 3 4 2

事实上也没有别的想得到的了。

我跑去看题解,发现单调性是这个毒瘤:

当单调不减子序列长度增加时,每个长度对应的最小高度增加。

然后每次二分出一个长度,保证最小高度刚好不大于a[i]

然后用a[i]更新f[i]的最小高度...

然后就没啥难点了,A了。

 #include <cstdio>
#include <algorithm>
#include <cstring> const int N = ; int a[N], f[N], p[N], top; inline int BS(int x) {
int l = , r = top, mid;
while(l < r) {
mid = (l + r + ) >> ;
if(p[mid] < x) {
r = mid - ;
}
else {
l = mid;
}
}
return r;
} inline int BS2(int x) {
int l = , r = top, mid;
while(l < r) {
mid = (l + r + ) >> ;
if(p[mid] >= x) {
r = mid - ;
}
else {
l = mid;
}
}
return r;
} int main() {
int n = , x;
while(scanf("%d", &x) != -) {
a[++n] = x;
}
for(int i = ; i <= n; i++) {
int t = BS(a[i]);
f[i] = t + ;
p[f[i]] = std::max(p[f[i]], a[i]);
top = std::max(top, f[i]);
}
printf("%d \n", top);
top = ;
memset(p, 0x7f, sizeof(p));
for(int i = ; i <= n; i++) {
int t = BS2(a[i]);
f[i] = t + ;
p[f[i]] = std::min(p[f[i]], a[i]);
top = std::max(top, f[i]);
}
printf("%d", top);
return ;
}

AC代码

附一张提交记录

洛谷P1020 导弹拦截的更多相关文章

  1. codevs1044 拦截导弹==洛谷 P1020 导弹拦截

    P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天 ...

  2. 洛谷 P1020导弹拦截题解

    洛谷链接:https://www.luogu.org/problem/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...

  3. 洛谷 P1020 导弹拦截(dp+最长上升子序列变形)

    传送门:Problem 1020 https://www.cnblogs.com/violet-acmer/p/9852294.html 讲解此题前,先谈谈何为最长上升子序列,以及求法: 一.相关概念 ...

  4. codevs——T1044 拦截导弹 || 洛谷——P1020 导弹拦截

    http://codevs.cn/problem/1044/ || https://www.luogu.org/problem/show?pid=1020#sub 时间限制: 1 s  空间限制: 1 ...

  5. 洛谷P1020 导弹拦截【单调栈】

    题目:https://www.luogu.org/problemnew/show/P1020 题意: 给定一些导弹的高度. 一个导弹系统只能拦截高度不增的一系列导弹,问如果只有一个系统最多能拦截多少导 ...

  6. 洛谷P1020导弹拦截——LIS

    题目:https://www.luogu.org/problemnew/show/P1020 主要是第二问,使用了dilworth定理:一个序列中最长不上升子序列的最大覆盖=最长上升子序列长度. di ...

  7. 洛谷 - P1020 - 导弹拦截 - 最长上升子序列

    https://www.luogu.org/problemnew/show/P1020 终于搞明白了.根据某定理,最少需要的防御系统的数量就是最长上升子序列的数量. 呵呵手写二分果然功能很多,想清楚自 ...

  8. 洛谷P1020 导弹拦截 题解 LIS扩展题 Dilworth定理

    题目链接:https://www.luogu.com.cn/problem/P1020 题目大意: 给你一串数,求: 这串数的最长不上升子序列的长度: 最少划分成多少个子序列是的这些子序列都是不上升子 ...

  9. 洛谷 [P1020] 导弹拦截 (N*logN)

    首先此一眼就能看出来是一个非常基础的最长不下降子序列(LIS),其朴素的 N^2做法很简单,但如何将其优化成为N*logN? 我们不妨换一个思路,维护一个f数组,f[x]表示长度为x的LIS的最大的最 ...

随机推荐

  1. 无法将从VSS中的解决方案添加到TFS的源代码管理器中

    VSS是一种非常有用的项目文件管理工具,百度百科的解释是:VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责 ...

  2. Java多线程5:Synchronized锁机制

    一.前言 在多线程中,有时会出现多个线程对同一个对象的变量进行并发访问的情形,如果不做正确的同步处理,那么产生的后果就是“脏读”,也就是获取到的数据其实是被修改过的. 二.引入Synchronized ...

  3. LOADING Redis is loading the dataset in memory Redis javaAPI实例

    今天在实现Redis客户端API操作Jedis的八种调用方式详解中,遇到了LOADING Redis is loading the dataset in memory错误,经过多番查找资料,找到了解决 ...

  4. HTTP协议 - 基础认识

    在http协议使用场景上我们最熟悉的可能就是浏览器了,作为本系列第一篇,就讲一个问题  ”浏览器怎么连接上服务器并获取网页内容的“ : 首先 浏览器怎么连接上服务器的? 如果对OSI七层模型或者TCP ...

  5. jQuery 获取url中的参数

    //获取url中的参数 function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "= ...

  6. java基础之Number

    1.Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper ...

  7. Lisp小程序,大作用,不该放弃!

    从听说autolisp到现在已经20年了, 学了一点点, 可惜中间没能坚持下来, 放弃了!     今天在画图, 图纸是从revit转成dwg的, 其中有些文本的朝向是错误的, 如果手工旋转很是费事, ...

  8. Mac下安装MySQL(Mac 10.12)

    系统:Mac OS 10.12 MySQL:5.7.15 前言: 安装mysql有两种方式:1为官方下载dmg安装包.2为使用brew进行安装. 安装步骤: 一.官方下载dmg安装包进行安装 1.登陆 ...

  9. mybatis,mysql批量delete多个记录

    1.dao 接口中 Integer delete(List<UserDeviceRela> relas); 2.xml <delete id="delete" p ...

  10. PHP——实现随机打乱一个二维数组

    <?php /* * @Author: wyy * @Date: 2019-01-28 10:26:29 * @Email: 2752154874@qq.com * @Last Modified ...