传送门

这道题信息量好大啊

1.Dilworth定理

  •   Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度。
  •   Dilworth定理的对偶定理:对于一个偏序集,其最少反链划分数等于其最长链的长度。

  其实就是说,对于一个序列,

  最大上升子序列长度 = 不上升子序列个数,最大不上升子序列长度 = 上升子序列个数,

  最大下降子序列长度 = 不下降子序列个数,最大不下降子序列长度 = 下降子序列个数。

  所以这道题:Q1求最大不上升子序列长度,Q2求不上升子序列个数 = 最大上升子序列长度。

2.STL函数:lower_bound( )和upper_bound( )

lower_bound(num,num+L,A)-num; //返回第一个 >=A 的值
upper_bound(num,num+L,A)-num; //返回第一个 >A 的值
lower_bound(num,num+L,A,greater<int>())-num; //返回第一个 <=A 的值
upper_bound(num,num+L,A,greater<int>())-num; //返回第一个 <A 的值

  只能在单调序列里调用,从前往后找

  lower是>=,upper是>,用greater或者cmp改成<= / <

  得到的是元素的地址,最后减去数组的地址就得到了元素下标。

  其实就是代替了二分查找...二分的写法见P1439 【模板】最长公共子序列

  需要调用<algorithm>库,如果用greater还要调用<iostream>

注意:

1.读入时

while(scanf("%d",&a[++n])!=EOF) {
continue;
}
n--;

因为是先进行++n操作再判断的,所以多了一次,最后要n--.

2.Q1每次要求更小的,所以up1[0]要赋值为INF,不能为0.

代码如下

动态规划( O(n^2),100分 )

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = ;
int n,ans,a[maxn],f[maxn],g[maxn];
int main() {
while(scanf("%d",&a[++n])!=EOF) {
f[n] = ;
g[n] = ;
}
for(int i = n; i >= ; i--)
for(int j = i+; j <= n; j++)
if(a[i] >= a[j])
f[i] = max(f[i],f[j]+);
for(int i = ; i <= n; i++)
ans = max(ans,f[i]);
printf("%d\n",ans);
ans = ;
for(int i = n; i >= ; i--)
for(int j = i+; j <= n; j++)
if(a[i] < a[j])
g[i] = max(g[i],g[j]+);
for(int i = ; i <= n; i++)
ans = max(ans,g[i]);
printf("%d\n",ans);
return ;
}

正解( O(nlogn),200分 )

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = ;
int n,ans,a[maxn],up1[maxn],up2[maxn];
int main() {
while(scanf("%d",&a[++n])!=EOF) {
continue;
}
n--;
up1[] = maxn;
for(int i = ; i <= n; i++) {
if(a[i] <= up1[ans])
up1[++ans] = a[i];
else {
int k = upper_bound(up1+,up1+ans+,a[i],greater<int>())-up1;
up1[k] = a[i];
}
}
printf("%d\n",ans);
ans = ;
up2[] = a[];
for(int i = ; i <= n; i++) {
if(a[i] > up2[ans])
up2[++ans] = a[i];
else {
int k = lower_bound(up2+,up2+ans+,a[i])-up2;
up2[k] = a[i];
}
}
printf("%d\n",ans);
return ;
}

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

  1. luogu P1020 导弹拦截 x

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

  2. 【LIS】Luogu P1020 导弹拦截

    昨天晚上看蓝书,看到了LIS问题的优化解法. 是比O(n方)更快的解法,实际上是一个常数优化. 先讲一下朴素的解法: 一个集合a,a[i]是第i个元素.设dp[i]为以编号为i的元素结尾的最长不上升子 ...

  3. Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)

    Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列) Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...

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

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

  5. p1020导弹拦截

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

  6. 【题解】P1020 导弹拦截

    [题解]P1020 导弹拦截 从n^2到nlogn 第二问就是贪心,不多说 第一问: 简化题意:求最长不下降子序列 普通n^2: for (int i = 1; i <= n; i++) for ...

  7. 洛谷 P1020导弹拦截题解

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

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

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

  9. P1020 导弹拦截(LIS)

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

随机推荐

  1. SQL Server中的数据类型

    参考 SQL Server 2012编程入门经典(第4版) SQL Server 自带的数据类型 整型: 货币 近似小数 日期/时间 特殊数字 字符 Unicode 二进制 其他

  2. Python全栈学习_day004作业

    ,写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&qu ...

  3. 关于 ul 嵌套 li 并且再嵌套 a 的 BUG

    在写网页的过程中,总是写完了这一套,样式出了问题又去找问题废了好长时间总结一下写法以下是结构 经常会出现 li 里面与文字不在一个高度上 <div class="indicators& ...

  4. imooc《JavaScript深入浅出》上的一个 arraysSimilar 函数

    任务 请在 index.html 文件中,编写 arraysSimilar 函数,实现判断传入的两个数组是否相似.具体需求: 数组中的成员类型相同,顺序可以不同.例如 [1, true] 与 [fal ...

  5. JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)

    一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...

  6. mysql插入表数据中文乱码问题解决方案

    一.问题 开发中遇到将其它数据库数据插入到mysql数据库表中一直会报类似如下错误: Incorrect string value: '\xE6\x88\x91' for column 'name' ...

  7. 将Windows下的InfluxDB、Grafana做成Windows服务

    从网上下载的Windows下的InfluxDB.Grafana,都是控制台程序,打开窗口后,很容易被别人给关掉,因此考虑做成Windows服务,nssm正是解决该问题的利器. 1.下载nssm htt ...

  8. 安卓开发_计时器(Chronometer)的简单使用

    计时器控件(Chronometer)是一个可以显示从某个起始时间开始一共过去多长时间的本文. 继承自TextView,以文本的形式显示时间内容 该组件有五个方法 1.setBase(): \\用于设置 ...

  9. PL/SQL 查询的数据出现乱码

    解决方法: 1.首先在查询出Oracle数据库的字符集. select userenv('language') from dual; 2.新建系统变量 NLS_LANG,变量值为第一步查询出来的字符集 ...

  10. tensorflow 文件队列

    使用文件队列,防止爆内存 # # 通过队列打开图片文件 file_queue = tf.train.string_input_producer(paths) img_reader = tf.Whole ...