1 条题解
-
0
暴力代码:。
#include<bits/stdc++.h> using namespace std; const int N=1e4+5; int a[N],f[N],ans[N]; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=n;i++){ f[i]=1; } for(int i=n;i>=1;i--){ for(int j=i+1;j<=n;j++){ if(a[j]>a[i]){ if(f[j]+1>f[i]){ f[i]=f[j]+1; } } } } int m;scanf("%d",&m); for(int i=1;i<=m;i++){ int l,bk=0,pos;scanf("%d",&l); for(int j=1;j<=n;j++){ if(f[j]>=l){ bk=1; pos=j; break; } } if(!bk){ puts("Impossible"); continue; } int now=l-1,cnt=1; ans[cnt]=a[pos]; for(int j=pos+1;j<=n;j++){ if(f[j]>=now&&a[j]>ans[cnt]){ cnt++; pos=j; ans[cnt]=a[pos]; now--; } if(cnt==l)break; } for(int j=1;j<=l;j++){ printf("%d ",ans[j]); } puts(""); } return 0; }
树状数组优化 dp:。
#include<bits/stdc++.h> using namespace std; const int N=1e4+5; int a[N],f[N],ans[N]; int c[N]; int len,lsh[N]; int get(int x){ return lower_bound(lsh+1,lsh+len+1,x)-lsh; } int lowbit(int x){ return x&-x; } void change(int x,int k){ while(x){ c[x]=max(c[x],k); x=x-lowbit(x); } } int query(int x){ int ans=0; while(x<N){ ans=max(ans,c[x]); x=x+lowbit(x); } return ans; } int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); lsh[i]=a[i]; } sort(lsh+1,lsh+n+1); len=unique(lsh+1,lsh+n+1)-lsh-1; for(int i=1;i<=n;i++){ a[i]=get(a[i]); } for(int i=n;i>=1;i--){ f[i]=query(a[i]+1)+1; change(a[i],f[i]); } int m;scanf("%d",&m); for(int i=1;i<=m;i++){ int l,bk=0,pos;scanf("%d",&l); for(int j=1;j<=n;j++){ if(f[j]>=l){ bk=1; pos=j; break; } } if(!bk){ puts("Impossible"); continue; } int now=l-1,cnt=1; ans[cnt]=a[pos]; for(int j=pos+1;j<=n;j++){ if(f[j]>=now&&a[j]>ans[cnt]){ cnt++; pos=j; ans[cnt]=a[pos]; now--; } if(cnt==l)break; } for(int j=1;j<=l;j++){ printf("%d ",lsh[ans[j]]); } puts(""); } return 0; }
- 1
信息
- ID
- 1046
- 时间
- 1000ms
- 内存
- 162MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 25
- 已通过
- 12
- 上传者