zoukankan      html  css  js  c++  java
  • [HAOI2007]上升序列

    题目:BZOJ1046、洛谷P2215、codevs1714。

    题目大意:对于一个给定的S={a1,a2,a3,…,an},若有P={$a_{x1},a_{x2},a_{x3},…,a_{xm}$},满足(x1<x2<…<xm) 且($a_{x1}<a_{x2}<…<a_{xm}$)。那么就称P为S的一个上升序列。如果有多个P满足条件,那么我们想求字典序最小的那个。(即首先x1最小,如果不唯一,再看x2最小……)

    解题思路:首先dp最长上升子序列。

    考虑询问,如果输入(设为k)大于LIS,直接Impossible。

    否则就有解。

    我们可以贪心输出。设f[i]为以i开头的LIS长度,如果f[i]>=k,则a[i]一定在答案当中。

    那我们就把k减1,然后重复此过程,直到k=0为止(当然后面的数要小于前面的数,再弄一个变量记录即可)。

    但问题是求出的f[i]表示的都是以i结尾的LIS长度,怎么办?

    我们把序列倒过来,然后求最长严格下降子序列,然后倒回来就会发现,f[i]表示的就是以i开头的LIS长度(实际上直接在倒着的数组上处理即可,不需转回来)。

    用单调队列可以优化dp。

    则总时间复杂度为$O(nlog_2 n+nm)$。

    C++ Code:

    #include<cstdio>
    #include<algorithm>
    #include<cctype>
    #include<cstring>
    #include<functional>
    using namespace std;
    int a[10005],q[10005],f[10005],n;
    inline int readint(){
    	char c=getchar();
    	for(;!isdigit(c);c=getchar());
    	int d=0;
    	for(;isdigit(c);c=getchar())
    	d=(d<<3)+(d<<1)+(c^'0');
    	return d;
    }
    int main(){
    	for(int i=n=readint();i;--i)a[i]=readint();
    	int k=1;
    	memset(q,0,sizeof q);
    	q[1]=a[1];
    	f[1]=1;
    	q[0]=0x3f3f3f3f;
    	for(int i=2;i<=n;++i){
    		int p=lower_bound(q,q+k+1,a[i],greater<int>())-q-1;
    		if(p==k)q[++k]=a[i];else
    		if(q[p+1]<a[i])q[p+1]=a[i];
    		f[i]=p+1;
    	}
    	for(int m=readint();m--;){
    		int p=readint();
    		if(p>k)puts("Impossible");else
    		for(int i=n;i;--i)
    		if(f[i]>=p){
    			printf("%d",a[i]);
    			--p;
    			int pre=a[i];
    			for(int j=i-1;j&&p;--j)
    			if(f[j]>=p&&a[j]>pre){
    				pre=a[j];
    				--p;
    				printf("% d",a[j]);
    			}
    			putchar('
    ');
    			break;
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    每日一题 为了工作 2020 0412 第四十一题
    每日一题 为了工作 2020 04011 第四十题
    每日一题 为了工作 2020 0410 第三十九题
    每日一题 为了工作 2020 0409 第三十八题
    每日一题 为了工作 2020 0408 第三十七题
    每日一题 为了工作 2020 0407 第三十六题
    每日一题 为了工作 2020 0406 第三十五题
    每日一题 为了工作 2020 0405 第三十四题
    学习总结(二十四)
    学习总结(二十三)
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7994313.html
Copyright © 2011-2022 走看看