Bzoj 1046: [HAOI2007]上升序列 二分,递推
1046: [HAOI2007]上升序列
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3671 Solved: 1255
[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
3 4 1 2 3 6
3
6
4
5
Sample Output
1 2 3 6
Impossible
HINT
数据范围
N<=10000
M<=1000
Source
#include<bits/stdc++.h>
using namespace std;
#define INF 1e9
#define MAXN 10010
int f[MAXN],a[MAXN],len[MAXN],mx,n,cc[MAXN];
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
int ef(int k)
{
int l=,r=mx,mid,ans=;
while(l<=r)
{
mid=(l+r)/;
if(f[mid]>k){ans=mid;l=mid+;}
else r=mid-;
}
return ans;
}
void print(int k)
{
int last=-,lc=,i;
for(i=;i<=n;i++)
{
if(len[i]>=k&&a[i]>last)
{
k--;
cc[++lc]=a[i];
last=a[i];
if(k==)break;
}
}
for(i=;i<lc;i++)printf("%d ",cc[i]);printf("%d",cc[lc]);
printf("\n");
}
int main()
{
int i,tmp,m,k,j;
n=read();
for(i=;i<=n;i++)a[i]=read();
memset(f,,sizeof(f));
memset(len,,sizeof(len));
mx=;
for(i=n;i>=;i--)
{
tmp=ef(a[i]);
len[i]=tmp+;
f[tmp+]=max(f[tmp+],a[i]);
mx=max(mx,tmp+);
}
m=read();
for(i=;i<=m;i++)
{
k=read();
if(k>mx)printf("Impossible\n");
else
{
print(k);
}
}
fclose(stdin);
fclose(stdout);
return ;
}
Bzoj 1046: [HAOI2007]上升序列 二分,递推的更多相关文章
- BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4987 Solved: 1732[Submit][Stat ...
- BZOJ 1046: [HAOI2007]上升序列 LIS -dp
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3438 Solved: 1171[Submit][Stat ...
- BZOJ 1046: [HAOI2007]上升序列(LIS)
题目挺坑的..但是不难.先反向做一次最长下降子序列.然后得到了d(i),以i为起点的最长上升子序列,接下来贪心,得到字典序最小. ----------------------------------- ...
- bzoj 1046 : [HAOI2007]上升序列 dp
题目链接 1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3620 Solved: 1236[Submit] ...
- [BZOJ 1046] [HAOI2007] 上升序列 【DP】
题目链接:BZOJ - 1046 题目分析 先倒着做最长下降子序列,求出 f[i],即以 i 为起点向后的最长上升子序列长度. 注意题目要求的是 xi 的字典序最小,不是数值! 如果输入的 l 大于最 ...
- bzoj 1046: [HAOI2007]上升序列【dp+二分】
先从后到前做一个最长下降子序列的dp,记录f[i],我这里用的是二分(其实树状数组比较显然) 然后对于询问,超出最长上升子序列的直接输出:否则从前到后扫,f[i]>=x&&a[i ...
- bzoj 1046: [HAOI2007]上升序列
Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...
- BZOJ 1046 [HAOI2007]上升序列(LIS + 贪心)
题意: m次询问,问下标最小字典序的长度为x的LIS是什么 n<=10000, m<=1000 思路: 先nlogn求出f[i]为以a[i]开头的LIS长度 然后贪心即可,复杂度nm 我们 ...
- 【BZOJ 1046】 1046: [HAOI2007]上升序列
1046: [HAOI2007]上升序列 Description 对于一个给定的S={a1,a2,a3,-,an},若有P={ax1,ax2,ax3,-,axm},满足(x1 < x2 < ...
随机推荐
- ScrollView 尽量避免嵌套RelativeLayout,非常惨痛的教训
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- linux强大IDE——Geany配置说明
今天开始用Ubuntu了(主要是为了防止自己在windows下不自觉的打游戏之类的) 刚开始用的很不习惯 找不到合适的编译器(DEV c++什么时候才能出Linux的啊) 先后下了codeli ...
- checkbox在jquery版本1.9 以上用attr不可重复操作的问题【附解决方案】
最近做个项目,需要重复多次更改checkbox的状态,使用jquery 1.10.2的最新版本时发现,对checkbox的选中状态无法多次选中.测试代码如下: <!DOCTYPE html PU ...
- thinkphp 杂乱笔记(1)
部署模式可用两个单入口表示前后台thinkphpUploadspublic Home(前台)Admin(后台)index.php(前台入口文件)admin.php(后台入口文件)上面两个项目目录 也可 ...
- textarea 超过字数
<textarea name="></textarea> <div id="statementRowChk"></div> ...
- js实现幻灯片播放图片示例代码
幻灯片播放图片的效果想必大家都有见到过吧,下面有个不错的示例,感兴趣的朋友可以参考下 复制代码代码如下: <select id="img_date" style=" ...
- 也说_T、_TEXT、TEXT、L
本片文章转载自:http://www.cnblogs.com/sobe/archive/2011/03/14/1984188.html 百度或谷歌一下,有很多大牛早已经写过无数相关的文章说明这几个宏的 ...
- easyUI:ComboTree and comselector使用实例解析
ComboTree 使用场景:故名思意,ComboTree是combox和Tree的结合体,在需要通过选择得到某一个node值的时候触发. 栗子: 定义: 使用标签创建树形下拉框. Comselect ...
- POJ 3267 The Cow Lexicon 简单DP
题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...
- Linq语句与aspnetpager结合分页
public void DataBindList() { List<EnDeContent> listCon = null; in ...