Luogu P1020 导弹拦截
这道题信息量好大啊
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 导弹拦截的更多相关文章
- luogu P1020 导弹拦截 x
首先上题目~ luogu P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都 ...
- 【LIS】Luogu P1020 导弹拦截
昨天晚上看蓝书,看到了LIS问题的优化解法. 是比O(n方)更快的解法,实际上是一个常数优化. 先讲一下朴素的解法: 一个集合a,a[i]是第i个元素.设dp[i]为以编号为i的元素结尾的最长不上升子 ...
- Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)
Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列) Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...
- codevs1044 拦截导弹==洛谷 P1020 导弹拦截
P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天 ...
- p1020导弹拦截
传送门 P1020导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度 ...
- 【题解】P1020 导弹拦截
[题解]P1020 导弹拦截 从n^2到nlogn 第二问就是贪心,不多说 第一问: 简化题意:求最长不下降子序列 普通n^2: for (int i = 1; i <= n; i++) for ...
- 洛谷 P1020导弹拦截题解
洛谷链接:https://www.luogu.org/problem/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...
- codevs——T1044 拦截导弹 || 洛谷——P1020 导弹拦截
http://codevs.cn/problem/1044/ || https://www.luogu.org/problem/show?pid=1020#sub 时间限制: 1 s 空间限制: 1 ...
- P1020 导弹拦截(LIS)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
随机推荐
- Js调试中不得不知的Console
在js调试中,大部分的前端人员都是采用console.log()方法来打印出调试的数据,但是很多人都不知道console这个对象有很多很实在的方法,本文就来介绍一下这些方法的使用. 一.console ...
- imooc《JavaScript深入浅出》上的一个 arraysSimilar 函数
任务 请在 index.html 文件中,编写 arraysSimilar 函数,实现判断传入的两个数组是否相似.具体需求: 数组中的成员类型相同,顺序可以不同.例如 [1, true] 与 [fal ...
- jsPlumb.jsAPI阅读笔记(官方文档翻译)
jsPlumb DOCS 公司要开始做流程控制器,所以先调研下jsPlumb,下文是阅读jsPlumb提供的document所产生的归纳总结 setup 如果不使用jQuery或者类jQuery库,则 ...
- SQLServer 2005Windows验证如何改为混合模式验证
SQL Server 2005 Windows验证如何改为混合模式验证[摘] by:授客 QQ:1033553122 默认情况下,SQL Server 2005 Express是采用集成的Window ...
- 14.python与数据库之mysql:pymysql、sqlalchemy
相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查 ...
- [20171107]dbms_shared_pool.pin补充.txt
[20171107]dbms_shared_pool.pin补充.txt --//上午的测试,做一些补充,主要还是一些理解问题. 1.环境:SCOTT@book> @ &r/ver1 P ...
- python第五十七天------补上笔记
direct_client:广播接收 #!/usr/bin/env python #_*_coding:utf-8_*_ import pika,time,sys connection = pika. ...
- Jenkins的配置从节点中默认没有Launch agent via Java Web Start,该如何配置使用
Jenkins的配置从节点中默认没有Launch agent via Java Web Start,如下图所示,而这种启动方式在Windows上是最方便的. 如何设置才能让出来呢? 1:打开" ...
- 理解inode 以及 软链接和硬链接概念区分
inode简单理解 本文来源自网络文章,并针对文章内容加以批注和修改.希望能帮到你! 一. 磁盘设备 说到inode,首先必须要提及下<操作系统>中磁盘存储器的管理一节.磁盘设备是一种相当 ...
- php处理手机号中间的四位为星号****
在显示用户列表的场景中,一般用到手机号的显示时都需要对手机号进行处理,一般是把中间的四位换成星号****,我本人用php处理的思路是进行替换,用****替换手机号的中间四位 代码如下: $all_lo ...