BZOJ1046/HAOI2007上升序列

来源:互联网 发布:王力宏 乐器 知乎 编辑:程序博客网 时间:2024/05/17 01:27

思路:
题目看错了,是位置的字典序最小。。水题,倒着想应该还是满显然的。

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;const int imax=10000+229;int n,Q;int f[imax]; int a[imax],ans[imax],len; int ibound(int x){    int l=1; int r=len; int pos=0;    while(l<=r)    {        int Mid=(l+r)>>1;        if(ans[Mid]>x) { pos=Mid; l=Mid+1;}        else r=Mid-1;       }    return pos;}void iprintf(int x){    int last=0;    for(int i=1;i<=n;i++)    {        if(f[i]>=x && a[i]>last)         {            printf("%d",a[i]);            if(x!=1) printf(" ");            last=a[i]; x--;         }           if(!x) break;     }       puts("");}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%d",&a[i]);    for(int i=n;i>=1;i--)    {        int pos=ibound(a[i]);        f[i]=pos+1;        len=max(len,pos+1);        if(ans[pos+1]<a[i]) ans[pos+1]=a[i];     }    scanf("%d",&Q);    while(Q--)    {        int nowlen;        scanf("%d",&nowlen);        if(nowlen>len) { puts("Impossible"); continue;}          else iprintf(nowlen);    }     return 0;}
0 0