BZOJ1046 洛谷 P2215 [HAOI2007]上升序列
2017-08-19 10:53
316 查看
题目描述
对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1
对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1
//lrh 大佬的 DP 不仅做得多,而且好,我的DP都是跟着他做的 //http://www.cnblogs.com/L-Memory #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; #define MAXN 50010 int dp[MAXN],a[MAXN],c[MAXN],Max_Len,n,m,p; inline int read(int &x){ x=0; int f=1; char c=getchar(); while(c>'9'||c<'0') { if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); } x*=f; } inline int query(int x){ int l=0,r=Max_Len,ret=0; while(l<=r){ int Mid=(l+r)>>1; if(c[Mid]>x) l=Mid+1,ret=Mid; else r=Mid-1; } return ret; } void output(int p){ int L=-0x7fffffff; for(int i=1;i<=n;++i) if(dp[i]>=p&&a[i]>L){ printf("%d",a[i]); if(p==1) { printf("\n");break; } else printf(" "),p--,L=a[i]; } } int main(){ read(n); for(int i=1;i<=n;++i) read(a[i]); memset(c,128,sizeof c ); c[0]=0x7fffffff; Max_Len=0; for(int i=n;i>=1;--i){ int t=query(a[i]); dp[i]=t+1; c[dp[i]]=max(c[dp[i]],a[i]); Max_Len=max(Max_Len,dp[i]); } read(m); for(int x,i=1;i<=m;++i){ read(x); if(x>Max_Len) printf("Impossible\n"); else output(x); } return 0; }
相关文章推荐
- BZOJ1046: [HAOI2007]上升序列(洛谷P2215)
- BZOJ 1046 洛谷 P2215 [HAOI2007] 上升序列
- BZOJ1046/HAOI2007上升序列
- Bzoj1046: [HAOI2007]上升序列
- 【动态规划】【最长上升子序列】【贪心】bzoj1046 [HAOI2007]上升序列
- 洛谷 P2215 [HAOI2007] 上升序列
- bzoj 1046 [HAOI2007] 上升序列 题解
- 【BZOJ 1046】【HAOI 2007】上升序列
- 【BZOJ 1046】[HAOI2007]上升序列 lis
- bzoj 1046: [HAOI2007]上升序列
- 【BZOJ 1046】 1046: [HAOI2007]上升序列
- bzoj 1046: [HAOI2007]上升序列 LIS
- [BZOJ 1046][HAOI 2007]上升序列(nlogn的LIS算法)
- BZOJ 1046: [HAOI2007]上升序列
- bzoj 1046: [HAOI2007]上升序列
- 2014.8.15模拟赛【公主的工作】&&bzoj1046[HAOI2007]上升序列
- [BZOJ 1046] [HAOI2007] 上升序列 【DP】
- BZOJ 1046: [HAOI2007]上升序列 【最长升降】
- 【BZOJ1046】 [HAOI2007]上升序列
- 1046: [HAOI2007]上升序列 - BZOJ