[P1020]导弹拦截 (贪心/DP/二分/单调队列)
一道很经典的题
这道题就是要求一个最长单调不升子序列和一个最长单调上升子序列。
先打了一个n2复杂度的
用DP
#include<bits/stdc++.h>
using namespace std;
#define N 10005
int f[N],a[N];
int n;
int cnt1,cnt2,tot;
int main()
{
while(scanf("%d",&a[++n])!=EOF);
n--;
// cout<<n<<endl;
// for(int i=1;i<=n;++i)cout<<a[i]<<' ';cout<<endl;
for(int i=;i<=n;i++)
{
f[i]=;
for(int j=;j<i;j++)
if(a[i]<=a[j]&&f[i]<f[j]+) f[i]=f[j]+;
if(f[i]>cnt1) cnt1=f[i];
}
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
{
f[i]=;
for(int j=;j<=i;j++)
if(a[i]>a[j]&&f[i]<f[j]+) f[i]=f[j]+;
if(cnt2<f[i]) cnt2=f[i];
}
printf("%d\n%d\n",cnt1,cnt2);
return ;
}
然后可以根据单调性进行优化
但是思想就不一样了
用二分简化成nlogn的
#include<bits/stdc++.h>
using namespace std;
int a[],f[],l[];
struct cmp{bool operator()(int a,int b){return a>b;}};
int main()
{
int n=;
while(cin>>a[n])n++;
n--;
int con=,cont=;
l[]=f[]=a[];
for(int i=;i<=n;i++)
{
if(l[cont]>=a[i])l[++cont]=a[i];
else l[upper_bound(l+,l+cont+,a[i],cmp())-l]=a[i];
if(f[con]<a[i])f[++con]=a[i];
else f[lower_bound(f+,f+con+,a[i])-f]=a[i];
}
cout<<cont<<" "<<con;
return ;
}
还有一个大佬的树状数组的
我放在下面
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[];
int z[];
int lowbit(int x)
{
return x&-x;
}
int big;
inline int ask(int x)//这是用来求单调上升子序列的
{
int r=;
for(int i=x;i>;i-=lowbit(i))
r=max(r,f[i]);
return r;
}
inline void add(int x,int v)//这也是用来求单调上升子序列的
{
for(int i=x;i<=big;i+=lowbit(i))
f[i]=max(f[i],v);
}
inline int que(int x)//这是用来求最长单调不升子序列的
{
int r=;
for(int i=x;i<=big;i+=lowbit(i))
r=max(r,f[i]);
return r;
}
inline void psh(int x,int v)//这也是用来求最长单调不升子序列的
{
for(int i=x;i>;i-=lowbit(i))
f[i]=max(f[i],v);
}
int tot;
int a[];
int ans;
int main()
{
tot=;
while(scanf("%d",&a[tot])!=EOF)
{
big=max(big,a[tot]);
z[tot]=a[tot];
tot++;
}
tot--;//读入并统计个数
for(int i=;i<=tot;i++)//求最长单升子序列,树状数组中保存的是0~a[i]的最大值
{
int x=ask(a[i])+;
ans=max(ans,x);
add(a[i]+,x);//因为是严格单升所以这里要+1
}
memset(f,,sizeof(f));//清空树状数组,用来求下面的不降子序列
int num=;
for(int i=;i<=tot;i++)//求最长不降子序列,树状数组里存的是a[i]~inf的最大值
{
int x=que(a[i])+;
num=max(num,x);
psh(a[i],x);//因为是不升而不是严格单降所以不用-1或+1
}
printf("%d\n%d",num,ans);
return ;
}
树状数组
[P1020]导弹拦截 (贪心/DP/二分/单调队列)的更多相关文章
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- P1020 导弹拦截 (贪心+最长不降子序列)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
- luogu P1020 导弹拦截 x
首先上题目~ luogu P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都 ...
- codevs1044 拦截导弹==洛谷 P1020 导弹拦截
P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天 ...
- p1020导弹拦截
传送门 P1020导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度 ...
- 【题解】P1020 导弹拦截
[题解]P1020 导弹拦截 从n^2到nlogn 第二问就是贪心,不多说 第一问: 简化题意:求最长不下降子序列 普通n^2: for (int i = 1; i <= n; i++) for ...
- NYOJ-258/POJ-2559/HDU-1506 Largest Rectangle in a Histogram,最大长方形,dp或者单调队列!
Largest Rectangle in a Histogram 这么经典的题硬是等今天碰到了原题现场懵逼两小时才会去补题.. ...
- NOIP模拟 最佳序列 - 二分 + 单调队列
题意: 各一个n(\(\le 20000\))的序列,定义纯洁序列为长度len满足\(L \le len \le R\)的序列,纯洁值为某一纯洁序列的平局值,输出所有纯洁序列中最大平均值. 分析: 二 ...
随机推荐
- 51 nod 1181 质数中的质数(质数筛法)
1181 质数中的质数(质数筛法) 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的 ...
- 全球免费公共 DNS 解析服务器 IP 地址列表推荐 (解决无法上网/加速/防劫持)
除了宽带提供商的 DNS 以外,像阿里云.腾讯云.Google.百度.IBM.CNNIC 等一些有足够实力的大型互联网公司也非常慷慨地为公众提供了免费的 DNS 解析服务器.异次元这就搜集了全球范围内 ...
- kafka 备忘
创建topic/usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --partitions 3 --rep ...
- pkusc2018数学题
题解: 还是很水的 复制个题面过来 好吧我不会复制 https://www.cnblogs.com/skylee03/p/9127130.html 题目链接 第一题是个傻逼题 初中数学题随便凑凑 ( ...
- pycharm-professional-2017.1.1.exe专业版激活方法
pycharm 2017.1专业版破解码 1.在server选项里边输入 http://elporfirio.com:1017/就可以了. BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJ ...
- windows server 2008性能测试出现大量time_wait
netstat -an | find "TCP" /C netstat -an | find "TIME_WAIT" /C taskkill /im mmdrv ...
- lvs-ldirectord
Ldirectord;用来对后端服务器的检测状态后并进行操作 安装在director上 对后端的rs服务器的 健康检查包括几方面: 1通过ping 若可以ping到服务器表示主机活着 2 对端口的检 ...
- 关闭PHP的opcache缓存
1.使用phpinfo();查看配置信息 2.搜索Additional .ini files parsed 3.查看opcache安装目录 4.打开文件将 opcache.enable=1 改成 ...
- Noj - 在线强化训练4
状态 题号 竞赛题号 标题 × 1092 A 童年的回忆——计算24 × 1145 B 求图像的周长 × 1144 C 农场灌溉问题 × 1202 D 数独游戏 × 1243 E 循环赛日程表 × 1 ...
- 20165235 2017-2018-2《Java程序设计》课程总结
20165235 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业一 预备作业二 预备作业三 第一周学习总结 第二周学习总结 第三周学习总结 第四周学习总结 ...