题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是\le 50000≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入格式
11行,若干个整数(个数\le 100000≤100000)

输出格式
22行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入输出样例
输入 #1复制
389 207 155 300 299 170 158 65
输出 #1复制
6
2

思路:dp[i]是代表i长度的上升子序列的最后一个数(也是最小的数)
i的最大值即为最长上升子序列。
对于a[i] 和a[j],a[i]>a[j] 以他们为结尾的上升子序列长度相等,
因此我们可以用a[j]来代替a[i],如果在后续中,k>a[i],就一定有k>a[j],但是k>a[j],就不一定有k>a[i],所以a[i]可以说是已经没用了,可以完全由a[j]代替。

具体模板代码:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define rep(i,n) for(int i=0;(i)<(n);i++)
#define rep1(i,n) for(int i=1;(i)<=(n);i++)
#define se secondusing namespace std;
typedef long long  ll;
typedef unsigned long long  ull;
typedef pair<int,int > pii;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1};
const ll mod=10007;
const ll N =1e6+10;
const double eps = 1e-4;
const double pi=acos(-1);
ll gcd(int a,int b){return !b?a:gcd(b,a%b);}
int dp1[N];
int dp2[N];
int a[N],n;
int main()
{ioswhile (cin >> a[++n]); n--;int len1=1,len2=1;dp1[1]=a[1];dp2[1]=a[1];for(int i=2;i<=n;i++){if(dp1[len1]>=a[i]) dp1[++len1]=a[i];else {int pos=upper_bound(dp1+1,dp1+1+len1,a[i],greater<int>())-dp1;dp1[pos]=a[i];}if(dp2[len2]<a[i]) dp2[++len2]=a[i];else {int pos=lower_bound(dp2+1,dp2+1+len2,a[i])-dp2;dp2[pos]=a[i];}}cout<<len1<<endl<<len2;
}

P1020 导弹拦截(n*log n时间的最长上升子序列思想)相关推荐

  1. luogu P1020 导弹拦截

    P1020 导弹拦截 1.Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度. 其实就是说,对于一个序列, 最大上升子序列长度 = 不上升子序列个数 最大不上升子序列长度 = 上升子序列 ...

  2. P1020 导弹拦截(最长不上升序列+二分)

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

  3. P1020 导弹拦截(LIS)

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

  4. P1020 导弹拦截

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

  5. 洛谷 [P1020] 导弹拦截 (N*logN)

    首先此一眼就能看出来是一个非常基础的最长不下降子序列(LIS),其朴素的 N^2做法很简单,但如何将其优化成为N*logN? 我们不妨换一个思路,维护一个f数组,f[x]表示长度为x的LIS的最大的最 ...

  6. LIS问题(最长上升子序列)与导弹拦截

    (前言)最长上升子序列LIS(longestincreasingsubsequence)LIS(longest\, increasing\, subsequence)LIS(longestincrea ...

  7. NYOJ 79 导弹拦截

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

  8. 洛谷P1020:导弹拦截

    P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题其实是两个问题的结合,可以互不干扰地求出. 第一个问题,NOPI里是可以用o ...

  9. 导弹拦截(洛谷-P1020)

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

最新文章

  1. python super 变参数问题(五)
  2. Linux下必须知道的11个网络命令
  3. VS2008 包加载失败导致VS2008打开 WebApplication项目时没有设计视图
  4. 【小白学习keras教程】二、基于CIFAR-10数据集训练简单的MLP分类模型
  5. 对寄存器ESP和EBP的一些理解
  6. 使用Oracle做定时任务
  7. ROS配置分布式通信
  8. 什么是shell? bash和shell有什么关系?
  9. 【大数据部落】R语言如何使用rjags R2jags来建立贝叶斯模型
  10. vue的下拉框如何回显_JAVA学习笔记系列:菜鸟Vue学习笔记(三)
  11. 获取并反编译微信小程序源码(仅供学习)
  12. Power bi 3.14 饼图
  13. iOSRGB常用的色值
  14. 基于 Ubuntu20.04 的工作环境搭建
  15. 利用Python实现腾讯校园招聘状态查询
  16. MATLAB 级数计算
  17. OpenCv基础知识(入门)
  18. css3切角文本框_[CSS揭秘]切角效果
  19. 如何基于MFC制作简易绘图软件
  20. 管理者应该会讲的68个超级经典小故事

热门文章

  1. 高速旋转中隐藏着许多鲜为人知的秘密,这些你都知道吗?
  2. 公交车座椅上有个洞,竟是为了…很多人都不知道
  3. 从小害怕数学的他,却成为了科普数学教育的数学家
  4. java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题
  5. python gdb coredump_Linux段错误及GDB Coredump调试方法
  6. 12c oracle 修改内存_关于Oracle数据库12c 新特性总结
  7. 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地
  8. 算法设计与分析——分支限界法——n皇后问题
  9. c++中的全排列函数next_permutation()
  10. mysql表缓冲大小可能设置过小_MySQL 5.7 my.cnf配置文件详解