最长上升子序列
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给出一个长度为N的整数序列,求出包含它的第K个元素的最长上升子序列。
输入
第一行两个整数N, K
第二行N个整数
输出
如题目所说的序列长度。
样例输入
8 6
65 158 170 299 300 155 207 389
样例输出
4
提示
【数据范围】
0 < N ≤ 200000,0 < K ≤ N
分析
去掉k以前的大于等于a[k]的,去掉k以后的小于等于a[k]的,再做LIS。
背板背错了,lower_bound背成upper_bound了。
人生中离AK最近的一次啊…………
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=202030;
int n,m,len,k,arr[MAXN],ark[MAXN],dp[MAXN];
int main()
{
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
for(int i=1;i<k;i++) if(arr[i]<arr[k]) ark[++m]=arr[i];
ark[++m]=arr[k];
for(int i=k+1;i<=n;i++) if(arr[i]>arr[k]) ark[++m]=arr[i];
dp[len=1]=ark[1];
for(int i=2;i<=m;i++)
if(ark[i]>=dp[len]) dp[++len]=ark[i];
else dp[lower_bound(dp+1,dp+len+1,ark[i])-dp]=ark[i];
printf("%d\n",len);
}