BZOJ 1046: [HAOI2007]上升序列(LIS)
題目挺坑的..但是不難.先反向做一次最長下降子序列.然后得到了d(i),以i為起點的最長上升子序列,接下來貪心,得到字典序最小.
?-------------------------------------------------------------------
#include<cstdio>#define rep(i,n) for(int i=0;i<n;++i)using namespace std;const int maxn=10005;const int inf=0x7fffffff;int a[maxn];int g[maxn];int d[maxn];int lowerBound(int l,int r,int v) {int mid;while(l<r) {mid=l+(r-l)/2;if(g[mid]<=v) r=mid;else l=mid+1;}return l;}int main(){freopen("test.in","r",stdin);freopen("test.out","w",stdout);int n,m;scanf("%d",&n);rep(i,n) { scanf("%d",&a[i]); g[i+1]=-inf; }for(int i=n-1;i>=0;--i) {int k=lowerBound(1,n,a[i]);d[i]=k;g[k]=a[i];}scanf("%d",&m);while(m--) {int l;scanf("%d",&l);if(g[l]==-inf) printf("Impossible");else {int last=-inf;rep(i,n) if(d[i]>=l && a[i]>last) {printf("%d",a[i]);if(0==--l) break;last=a[i];printf(" ");}}printf("\n");}return 0;}--------------------------------------------------------------------
1046: [HAOI2007]上升序列
Time Limit:?10 Sec??Memory Limit:?162 MBSubmit:?2843??Solved:?949
[Submit][Status][Discuss]
Description
對于一個給定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},滿足(x1 < x2 < … < xm)且( ax1 < ax2 < … < axm)。那么就稱P為S的一個上升序列。如果有多個P滿足條件,那么我們想求字典序最小的那個。任務給出S序列,給出若干詢問。對于第i個詢問,求出長度為Li的上升序列,如有多個,求出字典序最小的那個(即首先x1最小,如果不唯一,再看x2最小……),如果不存在長度為Li的上升序列,則打印Impossible.
Input
第一行一個N,表示序列一共有N個元素第二行N個數,為a1,a2,…,an 第三行一個M,表示詢問次數。下面接M行每行一個數L,表示要詢問長度為L的上升序列。
Output
對于每個詢問,如果對應的序列存在,則輸出,否則打印Impossible.
Sample Input
63 4 1 2 3 6
3
6
4
5
Sample Output
Impossible1 2 3 6
Impossible
HINT
數據范圍
N<=10000
M<=1000
?
轉載于:https://www.cnblogs.com/JSZX11556/p/4374561.html
總結
以上是生活随笔為你收集整理的BZOJ 1046: [HAOI2007]上升序列(LIS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: destoon实现调用热门关键字的方法
- 下一篇: C++ 文件大小格式化