1046: [HAOI2007]上升序列

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 5410  Solved: 1877

[Submit][Status][Discuss]

Description

  对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ax

2 < … < axm)。那么就称P为S的一个上升序列。如果有多个P满足条件,那么我们想求字典序最小的那个。任务给

出S序列,给出若干询问。对于第i个询问,求出长度为Li的上升序列,如有多个,求出字典序最小的那个(即首先

x1最小,如果不唯一,再看x2最小……),如果不存在长度为Li的上升序列,则打印Impossible.

Input

  第一行一个N,表示序列一共有N个元素第二行N个数,为a1,a2,…,an 第三行一个M,表示询问次数。下面接M

行每行一个数L,表示要询问长度为L的上升序列。N<=10000,M<=1000

Output

  对于每个询问,如果对应的序列存在,则输出,否则打印Impossible.

Sample Input

6

3 4 1 2 3 6

3

6

4

5

Sample Output

Impossible

1 2 3 6

Impossible

LIS的nlogn算法又用上了,但还是很不熟练

问题要我们算出字典序最小的方案

我们可以根据f[i]用O(n)的复杂度直接扫一遍,当前f[i]还在所求范围内而且A[i]满足条件就输出,保证了字典序最小

总的O(nlogn + nm)不会爆

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 10005,maxm = 100005,INF = 1000000000;
inline int RD(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
int A[maxn],f[maxn],bac[maxn],pos[maxn],pre[maxn],ans[maxn],n,len = 0;
int main(){
n = RD();
REP(i,n) A[i] = RD();
for (int i = n; i > 0; i--){
int l = 0,r = len,mid;
while (l < r){
mid = l + r + 1 >> 1;
if (bac[mid] && A[bac[mid]] > A[i]) l = mid;
else r = mid - 1;
}
f[i] = l + 1; pre[i] = bac[l];
if (!bac[f[i]] || A[i] > A[bac[f[i]]]) bac[f[i]] = i;
len = max(len,f[i]);
}
int m = RD(),v,last,first;
while (m--){
v = RD();
if (v > len) printf("Impossible\n");
else {
last = 0; first = true;
for (int i = 1; i <= n; i++)
if (f[i] >= v && A[i] > last){
if (first) first = false; else printf(" ");
printf("%d",A[i]);
last = A[i]; v--;
if (!v) break;
}
printf("\n");
}
}
return 0;
}

最新文章

  1. protocol http not supported or disabled in libcurl apt-get
  2. CentOS 6.5 安装Oracle 11G R2问题列表
  3. BZOJ2933: [Poi1999]地图
  4. Java线程:创建与启动
  5. 【WP开发】正确理解页面缓存
  6. iptables防火墙原理详解
  7. Do not to test a private method.
  8. 转:最值得学习阅读的10个C语言开源项目代码
  9. python之字串
  10. Swift基础知识入门(基于Swift2.0)
  11. opencv基础到进阶(1)
  12. spring-mvc List及数组的配置接收
  13. Go笔记-map
  14. LeetCode之“链表”:Add Two Numbers
  15. win10下配置默认软件(转)
  16. PowerShell自定义函数定义及调用
  17. [转]Memcache的使用和协议分析详解
  18. linux命令之 df file fsck fuser
  19. js对象和jquery对象互相转换
  20. Hibernate主配置文件、映射配置文件以及复合主键查询

热门文章

  1. poj3984迷宫问题(dfs+stack)
  2. hdu1848Fibonacci again and again(sg函数)
  3. RF上传图片各种失败坑,使用pywin32来操作windows窗体
  4. Windowserver2012部署always on
  5. lesson 18 Electric currents in modern art
  6. 七:HDFS Permissions Guide 权限
  7. Twaver的mono-desiner导出的json文件解析
  8. POJ 1921 Paper Cut(计算几何の折纸问题)
  9. 《剑指Offer》题二十一~题三十
  10. 20145214 《Java程序设计》第5周学习总结