当前位置:网站首页>洛谷 : P1020 [NOIP1999 普及组] 导弹拦截
洛谷 : P1020 [NOIP1999 普及组] 导弹拦截
2022-08-06 03:36:00 【小天狼星_布莱克】
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入格式
一行,若干个整数,中间由空格隔开。
输出格式
两行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入输出样例
输入 #1复制
389 207 155 300 299 170 158 65
输出 #1复制
6 2
说明/提示
对于前 50% 数据(NOIP 原题数据),满足导弹的个数不超过 2000 个。该部分数据总分共 100 分。可使用O(n²) 做法通过。
对于后 50% 的数据,满足导弹的个数不超过 10^5 个。该部分数据总分也为 100 分。请使用 O(nlogn) 做法通过。
对于全部数据,满足导弹的高度为正整数,且不超过 5×10^4。
此外本题开启 spj,每点两问,按问给分。
将拦截的导弹的高度提出来成为原高度序列的一个子序列,根据题意这个子序列中的元素是单调不增的(即后一项总是不大于前一项),我们称为单调不升子序列。本问所求能拦截到的最多的导弹,即求最长的单调不升子序列。
考虑记 dp_{i}dpi 表示「对于前 ii 个数,在选择第 ii 个数的情况下,得到的单调不升子序列的长度最长是多少」。于是可以分两种情况:
- 第 ii 个数是子序列的第一项。则 \mathit{dp}_i\gets 1dpi←1。
- 第 ii 个数不是子序列的第一项。选择的第 ii 个数之前选择了第 jj 个数。根据题意,第 jj 个数的值 h(j)h(j) 应当小于第 ii 个数的值 h(i)h(i)。枚举这样的 jj,可以得到状态转移方程:
\mathit{dp}_i=\max_{j<i,h(j)\ge h(i)} \{\mathit{dp_j}+1\}dpi=j<i,h(j)≥h(i)max{dpj+1}
综合这两种情况,得到最终的状态转移方程:
\mathit{dp}_i=\max\{1,\max_{j<i,h(j)\ge h(i)}\{\mathit{dp}_j+1\}\}dpi=max{1,j<i,h(j)≥h(i)max{dpj+1}}

值得注意的是,第 nn 个数不一定是最长单调不升子序列的最后一项。为了求出答案,我们需要枚举最后一项是哪个:
\mathit{ans}=\max_{1\le i\le n}\{\mathit{dp}_i\}ans=1≤i≤nmax{dpi}
直接枚举进行状态转移,时间复杂度显然是 \mathcal O(n^2)O(n2)。 下面考虑优化。
记 f_ifi 表示「对于所有长度为 ii 的单调不升子序列,它的最后一项的大小」的最大值。特别地,若不存在则 f_i=0fi=0。下面证明:
- 随 ii 增大,f_ifi 单调不增。即 f_i\ge f_{i+1}fi≥fi+1。
考虑使用反证法。假设存在 u<vu<v,满足 f_u<f_vfu<fv。考虑长度为 vv 的单调不升子序列,根据定义它以 f_vfv 结尾。显然我们可以从该序列中挑选出一个长度为 uu 的单调不升子序列,它的结尾同样是 f_vfv。那么由于 f_v>f_ufv>fu,与 f_ufu 最大相矛盾,得出矛盾。
因此 f_ifi 应该是单调不增的。
现在考虑以 ii 结尾的单调不升子序列的长度的最大值 \mathit{dp}_idpi。由于我们需要计算所有满足 h(j)>h(i)h(j)>h(i) 的 jj 中,\mathit{dp}_jdpj 的最大值,不妨考虑这个 \mathit{dp}_jdpj 的值是啥。设 \mathit{dp}_j=xdpj=x,那么如果 h(i)> f_xh(i)>fx,由于 f_x\ge h(j)fx≥h(j),就有 h(i)>h(j)h(i)>h(j),矛盾,因此总有 h(i)\le f_xh(i)≤fx。
根据刚刚得出的结论,f_ifi 单调不增,因此我们要找到尽可能大的 xx 满足 h(i)\le f_xh(i)≤fx。考虑二分。

绿色区域表示合法的 f_xfx(即 f_x\ge h(i)fx≥h(i)),红色区域表示不合法的 f_xfx(即 f_x< h(i)fx<h(i)),我们需要找到红绿之间的交界点。
假设二分区域为 [l,r)[l,r)(注意开闭区间。图上黄色区域标出来了二分区域内实际有效的元素)。每次取 m=\frac{l+r}{2}m=2l+r,如果 f_mfm 在绿色区域内,我们就把 ll 移动到此处(l\gets ml←m);否则把 rr 移动到此处(r\gets mr←m)。
当 r-l=1r−l=1 时,ll 处位置即为我们需要找的位置。转移 \mathit{dp}_i\gets l+1dpi←l+1 即可。记得更新 ff。但是我们只用更新 f_{\mathit{dp}_i}fdpi,这是因为 f_1,f_2,\cdots f_{\mathit{dp_i}-1}f1,f2,⋯fdpi−1 的大小肯定都是不小于 h(i)h(i) 的。f_{\mathit{dp}_i}fdpi 是最后一个不小于 h(i)h(i) 的位置,f_{\mathit{dp}_i+1}fdpi+1 则小于 h(i)h(i)。
时间复杂度 \mathcal O(n\log n)O(nlogn),可以通过该问。
第二问
考虑贪心。
从左到右依次枚举每个导弹。假设现在有若干个导弹拦截系统可以拦截它,那么我们肯定选择这些系统当中位置最低的那一个。如果不存在任何一个导弹拦截系统可以拦截它,那我们只能新加一个系统了。
假设枚举到第 ii 个导弹时,有 mm 个系统。我们把这些系统的高度按照从小到大排列,依次记为 g_1,g_2,\cdots g_mg1,g2,⋯gm。容易发现我们就是要找到最小的 g_xgx 满足 g_x\ge h_igx≥hi(与第一问相同,这是可以二分得到的),然后更新 g_xgx 的值。更新之后,g_1,g_2\cdots g_xg1,g2⋯gx 显然还是单调不增的,因此不用重新排序;如果找不到符合要求的导弹拦截系统,那就说明 g_m<h_igm<hi,直接在后头增加一个就行。
时间复杂度 \mathcal O(n\log n)O(nlogn),可以通过该问。
#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647;
const int MAXN=1e5+3;
int n,t,H[MAXN],F[MAXN];
int main(){
while(~scanf("%d",&H[++n])); --n;
t=0,memset(F,0,sizeof(F)),F[0]=INF;
up(1,n,i){
int l=0,r=t+1; while(r-l>1){
int m=l+(r-l)/2;
if(F[m]>=H[i]) l=m; else r=m;
}
int x=l+1; // dp[i]
if(x>t) t=x; F[x]=H[i];
}
printf("%d\n",t);
t=0,memset(F,0,sizeof(F)),F[0]=0;
up(1,n,i){
int l=0,r=t+1; while(r-l>1){
int m=l+(r-l)/2;
if(F[m]<H[i]) l=m; else r=m;
}
int x=l+1;
if(x>t) t=x; F[x]=H[i];
}
printf("%d\n",t);
return 0;
}边栏推荐
猜你喜欢

2018HBCPC部分题解

Literature Reading---Analysis of Genome Haplotypes and Genome Stability and Creeping of Common Bermudagrass Yangjiang

Programmer's first day at work | Daily anecdote

如果一个国家市场效果特别好,我们如何加大这个国家的投放比例。

Which browser has fewer ads?Multi-Royal Safe Browser Light Experience

If a country's market effect is particularly good, how can we increase the proportion of this country's investment?

慎用BeanUtils,性能真的拉跨!

If you like us, it is better to join us: come and contribute, the payment is reliable!

谷歌广告后台设置的投放语言,如果设置英语,就意味着用的人是使用英语吗?

2022 Alibaba Cloud server configuration selection strategy
随机推荐
LeetCode:623. 在二叉树中增加一行【DFS or BFS】
A complete solution for serial port data reception in QT
firewall 和ufw 笔记
Internet Security Aid: Free MD5 Decryption Website
xctf攻防世界 Web高手进阶区 upload1
2.cuBLAS开发指南中文版--使用cuBLAS API
jvm: synchronized关键字不同用法产生不同的字节码
R语言ggplot2循环中保存图片失败问题
请求DNS查找的host命令示例
2022年京东新百货七夕礼遇季活动有什么亮点?
If a country's market effect is particularly good, how can we increase the proportion of this country's investment?
Example of host command requesting DNS lookup
JVM: 设置代码执行模式(解释模式、编译模式、混合模式)
xctf Attack and Defense World Web Master Advanced Zone upload1
What is an Egg. The js, it have what features, installation of an Egg framework, definition of routing, what's Controller is the Controller, CORS configuration, the json configuration, a get request,
数字化智能工厂解决方案47页
什么是固体充气轮胎(solid pneumatic tyres)?
喜欢我们不如加入我们:来投稿吧,稿酬靠谱!
greenDAO of Android database framework
数字孪生实际应用案例-智慧港口篇