zzzyc

导航

[HAOI2007]上升序列

就是一道 NlogN 求最长上升子序列。。。然后贪心的题目。。。QAQ。。。

呆码:

#include<iostream>
#include<cstdio>
using namespace std;

int n,m,L,tot,f[10010],num[10010],a[10010];

inline int find(int x)
{
    int l=1,r=tot,cnt=0;
    while(l<=r)
    {
        int mid=l+r>>1;
        if(f[mid]>x) cnt=mid,l=mid+1;
        else r=mid-1;
    }
    return cnt;
}

inline void print(int x)
{
    int last=0;
    for(int i=1;i<=n;i++)
        if(num[i]>=x && a[i]>last)
        {
            printf("%d ",a[i]);
            x--; last=a[i];
            if(x==0) break;
        }
    printf("\n");
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    scanf("%d",&m);

    for(int i=n;i>=1;i--)
    {
        int t=find(a[i]);
        num[i]=t+1;
        tot=max(tot,t+1);
        if(f[t+1]<a[i]) f[t+1]=a[i];
    }

    for(int i=1;i<=m;i++)
    {
        scanf("%d",&L);
        if(L>tot) printf("Impossible\n");
        else print(L);
    }
}
代码

 

posted on 2018-07-13 14:26  zzzyc  阅读(163)  评论(0编辑  收藏  举报