洛谷 - P1020 - 导弹拦截 - 最长上升子序列
https://www.luogu.org/problemnew/show/P1020
终于搞明白了。根据某定理,最少需要的防御系统的数量就是最长上升子序列的数量。
呵呵手写二分果然功能很多,想清楚自己要找的是什么就可以了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
int n;
int a[100005];
int dp[50005];
int f1(int *dp,int a){
int l=1,r=n;
while(1){
int m=(l+r)>>1;
if(m==l){
if(dp[l]<a)
return l;
else
return r;
}
if(dp[m]<a){
r=m;
}
else{
l=m+1;
}
}
return -1;
}
int f2(int *dp,int a){
int l=1,r=n;
while(1){
int m=(l+r)>>1;
if(m==l){
if(dp[l]>=a)
return l;
else
return r;
}
if(dp[m]>=a){
r=m;
}
else{
l=m+1;
}
}
return -1;
}
int main(){
n=0;
int t;
while(~scanf("%d",&t)){
n++;
a[n]=t;
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
int id=f1(dp,a[i]);
//cout<<"id="<<id<<endl;
dp[id]=a[i];
/*for(int k=1;k<=n;k++){
printf("dp[%d]=%d\n",k,dp[k]);
}*/
}
int ans=n;
for(int i=1;i<=n;i++){
if(dp[i]==0){
ans=i-1;
break;
}
}
printf("%d\n",ans);
memset(dp,INF,sizeof(dp));
for(int i=1;i<=n;i++){
int id=f2(dp,a[i]);
//cout<<"id="<<id<<endl;
dp[id]=a[i];
/*for(int k=1;k<=n;k++){
printf("dp[%d]=%d\n",k,dp[k]);
}*/
}
ans=n;
for(int i=1;i<=n;i++){
if(dp[i]==INF){
ans=i-1;
break;
}
}
printf("%d\n",ans);
}
洛谷 - P1020 - 导弹拦截 - 最长上升子序列的更多相关文章
- codevs1044 拦截导弹==洛谷 P1020 导弹拦截
P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天 ...
- 洛谷 P1020 导弹拦截(dp+最长上升子序列变形)
传送门:Problem 1020 https://www.cnblogs.com/violet-acmer/p/9852294.html 讲解此题前,先谈谈何为最长上升子序列,以及求法: 一.相关概念 ...
- 【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截
最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html 这题是最长不上升子序列,倒 ...
- 洛谷 P1020导弹拦截题解
洛谷链接:https://www.luogu.org/problem/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...
- 洛谷P1020 导弹拦截【单调栈】
题目:https://www.luogu.org/problemnew/show/P1020 题意: 给定一些导弹的高度. 一个导弹系统只能拦截高度不增的一系列导弹,问如果只有一个系统最多能拦截多少导 ...
- codevs——T1044 拦截导弹 || 洛谷——P1020 导弹拦截
http://codevs.cn/problem/1044/ || https://www.luogu.org/problem/show?pid=1020#sub 时间限制: 1 s 空间限制: 1 ...
- 洛谷P1020导弹拦截——LIS
题目:https://www.luogu.org/problemnew/show/P1020 主要是第二问,使用了dilworth定理:一个序列中最长不上升子序列的最大覆盖=最长上升子序列长度. di ...
- 洛谷P1020 导弹拦截 题解 LIS扩展题 Dilworth定理
题目链接:https://www.luogu.com.cn/problem/P1020 题目大意: 给你一串数,求: 这串数的最长不上升子序列的长度: 最少划分成多少个子序列是的这些子序列都是不上升子 ...
- 洛谷 [P1020] 导弹拦截 (N*logN)
首先此一眼就能看出来是一个非常基础的最长不下降子序列(LIS),其朴素的 N^2做法很简单,但如何将其优化成为N*logN? 我们不妨换一个思路,维护一个f数组,f[x]表示长度为x的LIS的最大的最 ...
随机推荐
- iOS菜鸟学习--怎样避免两个button同一时候响应
在測试应用时.有时会变态的将两个UIButton同一时候按住来測试.结果就是两个button会同一时候响应,会出现同一时候push两个viewcontroller等非正常情况.为了避免用户误操作造成这 ...
- WPF前台数据验证(红框)Validation.ErrorTemplate 附加属性
WPF 显示验证错误的默认方式是在控件周围绘制红色边框.通常需要对此方法进行自定义,以通过其他方式来显示错误.而且,默认情况下不会显示与验证错误关联的错误消息.常见的要求是仅当存在验证错误时才在工具提 ...
- LeetCode(83)题解: Remove Duplicates from Sorted List
https://leetcode.com/problems/remove-duplicates-from-sorted-list/ 题目: Given a sorted linked list, de ...
- LeetCode(70)题解: climbing-stairs
https://leetcode.com/problems/climbing-stairs/ 题目: You are climbing a stair case. It takes n steps t ...
- Package md5 implements the MD5 hash algorithm as defined in RFC 1321 base64
https://golang.google.cn/pkg/crypto/md5/ Go by Example 中文:Base64编码 https://books.studygolang.com/gob ...
- 13.JavaScript 类
JavaScript 类 JavaScript 是面向对象的语言,但 JavaScript 不使用类. 在 JavaScript 中,不会创建类,也不会通过类来创建对象(就像在其他面向对象的语言中那样 ...
- 分词系统简介:PHPAnalysis分词程序
分词系统简介:PHPAnalysis分词程序使用居于unicode的词库,使用反向匹配模式分词,理论上兼容编码更广泛,并且对utf-8编码尤为方便. 由于PHPAnalysis是无组件的系统,因此速度 ...
- 使用Scapy回放报文pcap
一.准备环境: Ubuntu + python2.7 sudo apt-get install python-scapy 二.准备报文: 先抓取一些报文,本实验使用的是DHCP的报文. 文件-导出 ...
- LightOJ1214 Large Division —— 大数求模
题目链接:https://vjudge.net/problem/LightOJ-1214 1214 - Large Division PDF (English) Statistics Forum ...
- LightOJ1370 Bi-shoe and Phi-shoe —— 欧拉函数
题目链接:https://vjudge.net/problem/LightOJ-1370 1370 - Bi-shoe and Phi-shoe PDF (English) Statistics ...