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)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
随机推荐
- APP接口调用流程
- canvas-star0.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【代码笔记】Web-HTML-图像
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- video 铺满父元素(object-fit: fill;)
遇到这个属性,是在给video 嵌入一个div时,导致video播放器上下有灰色.在控制台查看video默认样式的时候看到了这个属性. 播放器上下的灰色,不是我们想要的样式,如果能完全覆盖就更好了. ...
- 我的Java之旅 第二课 Eclipse使用
1.项目引用的jar包管理 在Project Explorer中找到你要添加jar包的项目,右键项目名,点击Properties. 在弹出的窗体中,点击Resource中的JAVA Build Pat ...
- system.transfer.list版本进化
从android5.0开始之后,recovery升级包中不再升级system.img,而是升级system.new.dat+system.transfer.list的这种文件组合,经过android版 ...
- Spring Boot 技术总结
Spring Boot(一):入门篇 Spring Boot(二):Web 综合开发 Spring Boot(三):Spring Boot 中 Redis 的使用 Spring Boot(四):Thy ...
- 洗礼灵魂,修炼python(10)--有趣的判断分支+从实例中掌握循环语句
所有的编程语言里都有判断语句和循环语句. 判断语句则是用来分支程序流程的 循环语句则是为了实现一个效果,让程序的规律性的重复操作 不用说,分支和循环自然在python里也是有的 一,条件判断:if,i ...
- python第九十一天----第十六周作业
实现功能: 1.非编辑模式 可以对每行进行选择,全选,取消,反选 : 2.编辑模式 进入编辑模式时: 如果行被选中,则被选中的行变为可编辑状态,未选中则不改变 退出编辑模式时: 保存所有的 ...
- 面向对象的封装与隐藏 this
当我们创建一个对象的时候,我们可以通过‘对象.属性’的方式,对对象的属性进行赋值. 这里赋值操作要受到属性的数据类型和存储范围的制约,但是除此之外,没有其他制约条件. 但是实际问题中我们需要给这个属性 ...