BZOJ 1046: [HAOI2007]上升序列

来源:互联网 发布:淘宝网店图片设计制作 编辑:程序博客网 时间:2024/04/29 20:26

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1046


代码:

#include <iostream>#include <cstdio>#include <cstring>#include <string.h>#include <queue>#include <vector>#include <algorithm>#include <cassert>#include <set>#include <map>#include <cmath>#include <ctime>using namespace std;#define rep(i,a,b) for(int i=(a);i<(b);++i)#define rrep(i,a,b) for(int i=(a);i>=(b);--i)#define clr(a,x) memset(a,(x),sizeof(a))#define eps 1e-8#define LL long long#define mp make_pairconst int maxn=100000+5;int A[maxn];int S[maxn],len,dp[maxn],maxlen;int ans[maxn];int n;void output(int L){    int sz=0,pre=1<<31;    rep(i,1,n+1) {        if(dp[i]>=L&&pre<A[i]) {            --L; ans[sz++]=A[i];            pre=A[i];        }        if(L==0) break;    }}int main(){    while(scanf("%d",&n)==1) {        rep(i,1,n+1) scanf("%d",A+i);        len=0;        rrep(i,n,1) {            int j=lower_bound(S,S+len,-A[i])-S;            dp[i]=j+1;            if(j==len) ++len;            S[j]=-A[i];        }        int m; scanf("%d",&m);        while(m--) {            int l; scanf("%d",&l);            if(len<l) { puts("Impossible"); continue; }            output(l); printf("%d",ans[0]);            rep(i,1,l) printf(" %d",ans[i]);            puts("");        }    }}


0 0
原创粉丝点击