zoukankan      html  css  js  c++  java
  • [Vijos P1369]难解的问题

    题目大意:给你一个序列,叫你求最长上升子序列长度,但必须包含第k项。

    解题思路:我们把k左边的比a[k]大的数去掉,k右边的比k小的数去掉,就可以保证选到a[k]了(因为左边的数小于a[k],而a[k]小于右边的数,取了a[k]一定比不取优)。

    此题由于n到300000,需要优化后的LIS,我使用了单调队列优化。时间复杂度$O(nlog n)$。

    C++ Code:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,k,a[300005],b[300005],q[300005];
    int main(){
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;++i)
    	scanf("%d",&a[i]);
    	int cnt=0;
    	for(int i=1;i<k;++i)
    	if(a[i]<a[k])b[++cnt]=a[i];
    	b[++cnt]=a[k];
    	for(int i=k+1;i<=n;++i)
    	if(a[k]<a[i])b[++cnt]=a[i];
    	n=cnt;
    	cnt=0;
    	q[0]=-1;
    	for(int i=1;i<=n;++i){
    		if(b[i]>q[cnt]){
    			q[++cnt]=b[i];
    			continue;
    		}
    		int p=lower_bound(q,q+cnt,b[i])-q-1;
    		if(q[p+1]>b[i])q[p+1]=b[i];
    	}
    	printf("%d
    ",cnt);
    	return 0;
    }
    
  • 相关阅读:
    BETA 版冲刺前准备
    第十一次作业
    Alpha 冲刺 (10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    Alpha 冲刺 (5/10)
    Alpha 冲刺 (4/10)
    抽奖系统现场编程
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7291179.html
Copyright © 2011-2022 走看看