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)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
随机推荐
- Django Rest Framework之权限
基本代码结构 url.py: from django.conf.urls import url, include from app import views urlpatterns = [ url(r ...
- java动态代理--一个简单的例子
这几天看视频看到了java的动态代理,这里写一个小例子.在写例子的时候发现:认为自己会了,和能写出来真不是一个概念.还是要多写代码,然后写博客再深入一些,费曼学习法--教,是最好的学. 1.什么是动态 ...
- 洛谷P4562 [JXOI2018]游戏(组合数学)
题意 题目链接 Sol 这个题就比较休闲了. \(t(p)\)显然等于最后一个没有约数的数的位置,那么我们可以去枚举一下. 设没有约数的数的个数有\(cnt\)个 因此总的方案为\(\sum_{i=c ...
- 【工具相关】Web-Sublime Text2-安装插件HTMLPrettify
一,打开Sublime Text2---->Preferences--->Browse Packages.--->查看Sublime Text2已经有的插件.如图所示. 二,在网上下 ...
- 【读书笔记】iOS-Objective-C编程
Objective-C中的类可以继承自任何一个顶级类,需要注意的是,虽然NSObject是最常见的顶级类,但是它并不是唯一的顶级类,例如,NSProxy就是和NSObject一样的顶级类,所以你不能说 ...
- sqlserver每行都有累加,你怎么搞,窗口函数来帮忙!!!
在统计中我们经常会面临复杂的查询,例如累加,最近也遇到一个很好的例子,今天我们一起来看看: 有一个关于销售数据的视图,字段有:emptyid(员工编号),ordermonth( ...
- 机器学习是万能的吗?AI落地有哪些先决条件?
机器学习是万能的吗?AI落地有哪些先决条件? https://mp.weixin.qq.com/s/9rNY2YA3BMpoY8NQ_rVIjQ 1.引言 入门机器学习或从事其相关工作前,不知道你思考 ...
- 安卓开发_浅谈DatePicker(日期选择器)
DatePicker继承自FrameLayout类,日期选择控件的主要功能是向用户提供包含年.月.日的日期数据并允许用户对其修改.如果要捕获用户修改日期选择控件中的数据事件,需要为DatePicker ...
- MVC与单元测试实践之健身网站(六)-计划的添加与重置
健身计划需要使用者自己定制,没有现成的内容可供选择.本篇就是关于健身计划的添加与重置功能的一部分. 一 功能描述 a) 关于计划的定制,决定以周期的方式,比如有人会以一周为周期,然后安排每周的1.3. ...
- 【Java入门提高篇】Day24 Java容器类详解(七)HashMap源码分析(下)
前两篇对HashMap这家伙的主要方法,主要算法做了一个详细的介绍,本篇主要介绍HashMap中默默无闻地工作着的集合们,包括KeySet,values,EntrySet,以及对应的迭代器:HashI ...