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)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
随机推荐
- Manjaro使用笔记-使用中国源的方法
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错!生成可用中国镜像站列表: sudo pacman-mirrors -i -c China -m rank 勾选弹窗里面的所有源刷新 ...
- thymeleaf-extras-db 0.0.1发布,select标签加载数据的新姿势
在写thymeleaf页面的时候,我为了偷懒,不想为每个select下拉列表框都写一个接口,于是这个懒人jar诞生了.该jar的核心功能是直接通过thymeleaf页面的自定义标签的属性,直接运行sq ...
- 腾讯Tars环境搭建 ---- centos
1,安装git yum install git 2,下载脚本 git clone https://github.com/tangramor/Tars_Install.git 注意:会有3个脚本,cen ...
- Linux 学习笔记之超详细基础linux命令 Part 7
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 6----------------- ...
- iOS开发-本地存储(偏好设置,Plist,归档)
1. NSUserDefaults //TODO: 1.NSUserDefaults NSUserDefaults类除了可以存储数组.字典.NSdata外,还可以直接存储OC基本类型属性.但是不能 ...
- Ubuntu16下配置支持Windows访问的samba共享
一.安装Ubuntu samba服务器 $ sudo apt-get install samba $ sudo apt-get install smbclient # Linux客户端测试用 二.创建 ...
- 08-OpenLDAP主机控制策略
OpenLDAP主机控制策略 阅读视图 参考 环境准备 openldap服务端配置 openldap客户端配置 客户端测试登录 故障处理 1. 参考 本文基本转载博客openldap主机访问控制(基于 ...
- macOS 下NFS 文件系统挂载
主要有两种方式: 使用:resvport选项, mount 挂载命令时. 使用:insecure选项, exportfs 文件配置时. sudo mount -o resvport IP:Addr b ...
- C++中int型与string型互相转换(转)
http://greatverve.cnblogs.com/archive/2012/10/24/cpp-int-string.html 本以为这么多年C#经验,学个C++没多难,现在发现错了.C++ ...
- 【PAT】B1042 字符统计(20 分)
/* 15分的题很简单,但是自己写的时候在输入数据时没有考虑好下标 另外有忘记了输入字符时考虑是否有\n */ #include<stdio.h> #include<algorith ...