您的位置:首页 > 其它

【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截

2014-10-28 08:42 351 查看
最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html
这题是最长不上升子序列,倒过来当最长不下降子序列搞就行。

若是最长上升子序列,将upper_bound改成lower_bound即可。

#include<cstdio>
#include<algorithm>
using namespace std;
int n,en=1,d[100001],b[100001],k=1,t[100001],l[100001];
int* p;
int main()
{
while(scanf("%d",&t[n+1])!=EOF) n++;
for(int i=1,j=n;i<=n;i++,j--) d[i]=t[j];
l[1]=t[1];
for(int i=2;i<=n;i++)
{
int x=0;
for(int j=1;j<=k;j++)
if(l[j]>=t[i])
{
if(!x) x=j;
else if(l[j]<l[x]) x=j;
}
if(!x) l[++k]=t[i];
else l[x]=t[i];
}
b[1]=d[1];
for(int i=2;i<=n;i++)
{
p=upper_bound(b+1,b+en+1,d[i]);
if(!(*p)) en++;
(*p)=d[i];
}
printf("%d\n%d\n",en,k);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: