【原创】包含第k个元素的最长上升子序列

本文探讨了在给定整数序列中寻找包含特定元素的最长上升子序列问题。通过预处理序列,去除不必要的元素,然后应用最长上升子序列(LIS)算法,实现了高效的解决方案。代码示例使用C++实现,展示了如何利用lower_bound函数优化搜索过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最长上升子序列

时间限制: 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值