就是一道 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(" "); } 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 "); else print(L); } }