1 条题解

  • 0
    @ 2023-11-1 11:29:50

    暴力代码:O(n2)O(n^2)

    #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:O(nlogn)O(n \log n)

    #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
    上传者