bzoj1046上升序列 DP+记录路径

来源:互联网 发布:淘宝到货多久确认收货 编辑:程序博客网 时间:2024/06/06 09:44
反向dp f[i]表示从n到i的最长不上升序列长度 打印的时候直接扫一遍就可以了。
#include <cstdio>#include <iostream>#include <cstring>#include <cmath>using namespace std;#define maxn 11000int a[maxn],n,cnt,p,len,x,b[maxn],f[maxn],maxl,m;inline int getpos(int k,int l,int r){    if(l==r)        return l;    int mid=(l+r)>>1;    if(b[mid]<=k)        return getpos(k,l,mid);    else        return getpos(k,mid+1,r);}inline void print(int len,int sta){    for (int i=sta+1;i<=n;i++)        if (f[i]>=len&&a[i]>a[sta])        {            if (len==1)            {                printf("%d\n",a[i]);                return;            }            else printf("%d ",a[i]);            print(len-1,i);            break;        }}int main(){    scanf("%d",&n);    for (int i=1;i<=n;i++)        scanf("%d",&a[i]);    b[1]=a[n];    cnt=1;    f[n]=1;    for(int i=n-1;i>=1;i--)    {        int pos=getpos(a[i],1,cnt+1);        b[pos]=a[i];        if(pos>cnt)            cnt=pos;        if(cnt>maxl)            maxl=cnt;        f[i]=pos;    }    scanf("%d",&m);    for (int i=1;i<=m;i++)    {        scanf("%d",&x);        if (x>maxl)            printf("Impossible\n");        else            print(x,0);    }    return 0;}

0 0
原创粉丝点击