[HAOI2007]上升序列(最长上升子序列)
题目描述
对于一个给定的 S=\{a_1,a_2,a_3,…,a_n\}S={a1,a2,a3,…,an} ,若有 P=\{a_{x_1},a_{x_2},a_{x_3},…,a_{x_m}\}P={ax1,ax2,ax3,…,axm} ,满足 (x_1<x_2<…<x_m)(x1<x2<…<xm)且 (a_{x_1}<a_{x_2}<…<a_{x_m})(ax1<ax2<…<axm) 。那么就称P为S的一个上升序列。如果有多个P满足条件,那么我们想求字典序最小的那个。
任务
给出 SS 序列,给出若干询问。对于第 ii 个询问,求出长度为 L_iLi 的上升序列,如有多个,求出字典序最小的那个(即首先 x_1x1 最小,如果不唯一,再看 x_2x2 最小……),如果不存在长度为 L_iLi 的上升序列,则打印Impossible.
输入输出格式
输入格式:
第一行一个 NN ,表示序列一共有 NN 个元素
第二行 NN 个数,为 a_1, a_2 , \cdots , a_na1,a2,⋯,an
第三行一个 MM ,表示询问次数。下面接 MM 行每行一个数 LL ,表示要询问长度为 LL 的上升序列。
输出格式:
对于每个询问,如果对应的序列存在,则输出,否则打印Impossible.
思路:
题意很简单,求字典序最小的长度为lis
但这道题要你输出求得的lis,所以我们要反着求lis(否则你会和我一开始一样一直wa)
我们的dp数组表示从这项开始,向后的最长上升子序列的长度
查询的时候,按从小到大遍历,满足上升就输出
代码(请无视注释,那是我一开始的代码):
#include<iostream>
#include<cstdio>
#define rii register int i
#define rij register int j
using namespace std;
int dp[],x[],pre[],maxn,ask,ans[],n,m;
int main()
{
scanf("%d",&n);
for(rii=;i<=n;i++)
{
scanf("%d",&x[i]);
dp[i]=;
}
scanf("%d",&m);
for(rii=n-;i>=;i--)
{
for(rij=i+;j<=n;j++)
{
if(x[j]>x[i])
{
if(dp[j]+>dp[i])
{
dp[i]=dp[j]+;
}
}
}
maxn=max(maxn,dp[i]);
// if(maxn>imax)imax=maxn;
}
// for(rii=2;i<=n;i++)
// {
// for(rij=1;j<=i-1;j++)
// {
// if(x[i]>x[j])
// {
// if(dp[i]<dp[j]+1)
// {
// dp[i]=dp[j]+1;
// pre[i]=j;
// }
// }
// }
// maxn=max(maxn,dp[i]);
// }
for(rii=;i<=m;i++)
{
scanf("%d",&ask);
if(ask>maxn)
{
puts("Impossible");
continue;
}
int wz=ask;
int pre=-;
for(rij=;j<=n;j++)
{
if(dp[j]>=wz&&x[j]>pre)
{
printf("%d ",x[j]);
pre=x[j];
wz--;
if(wz==)
{
break;
}
}
}
// for(rii=1;i<=n;i++)
// {
// if(dp[i]==ask)
// {
// wz=i;
// break;
// }
// }
// ans[ask]=x[wz];
// int ltt=ask;
// int kkk=pre[wz];
// while(ltt--)
// {
// ans[ltt]=x[kkk];
// kkk=pre[kkk];
// }
// for(rij=1;j<=ask;j++)
// {
// printf("%d ",ans[j]);
// }
puts("");
}
}
[HAOI2007]上升序列(最长上升子序列)的更多相关文章
- shuoj1936-D序列—最长上升子序列
Description 已知两个长度为N的数组A和B.下标从0标号至N-1. 如今定义一种D序列 (如果长度为L).这样的序列满足下列条件: 1. 0 <= D[i] <= N-1 2. ...
- 【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数 ...
- 【动态规划】【最长上升子序列】【贪心】bzoj1046 [HAOI2007]上升序列
nlogn求出最长上升子序列长度. 对每次询问,贪心地回答.设输入为x.当前数a[i]可能成为答案序列中的第k个,则若 f[i]>=x-k && a[i]>ans[k-1] ...
- 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
一, 最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...
- HDU-4521 小明系列问题——小明序列 间隔限制最长上升子序列
题意:给定一个长度为N的序列,现在要求给出一个最长的序列满足序列中的元素严格上升并且相邻两个数字的下标间隔要严格大于d. 分析: 1.线段树 由于给定的元素的取值范围为0-10^5,因此维护一棵线段树 ...
- 【LCS,LIS】最长公共子序列、单调递增最长子序列
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 ...
- hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明
题目:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11313 湖师大的比赛,见我的另一篇水题题解,这里要说的 ...
- C语言 · 最长公共子序列 · 最长字符序列
算法提高篇有两个此类题目: 算法提高 最长字符序列 时间限制:1.0s 内存限制:256.0MB 最长字符序列 问题描述 设x(i), y(i), z(i)表示单个字符,则X={x( ...
- POJ - 2533 Longest Ordered Subsequence与HDU - 1257 最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)(LIS)
Longest Ordered Subsequence A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let ...
随机推荐
- java输出九九乘法口诀表
使用双重for循环输出九九乘法口诀表 public static void main(String[] args){ formula();} /** * for 循环实现9*9乘法口诀表 * &quo ...
- 在C#中生成GUID的方法
var guid = Guid.NewGuid();Debug.WriteLine(guid.ToString()); //1f3c6041-c68f-4ab3-ae19-f66f541e3209 ...
- Avro-RPC client in Flume
Avro used in Flume Define the interface of RpcClient public interface RpcClient { public int getBatc ...
- .NET开源工作流RoadFlow-表单设计-按钮
在表单中添加一个按钮: 宽度,高度:按钮的宽度和高度. 文本:按钮显示的文本. 事件:点击按钮执行的操作.
- ImageLoader简单使用
效果图就是一个从网络加载的图片:在加载的时候图片的中间显示一个进度条 数据是随便找的一个网络图片的地址 导入jar包universal-image-loader-1.9.5 用来展示商品使用 在 ...
- HTTP协议安全头部X-Content-Type-Options引入的问题
前段时间测试MM反馈了一个问题,在富文本编辑器里上传的图片无法正常呈现.因为Jackie在本机的环境上没有观察类似的现象,而恰好那天测试环境的某个重要配项被改错了,于是Jackie想当然的归类为配置项 ...
- 深入浅出 关于SQL Server中的死锁问题
深入浅出 关于SQL Server中的死锁问题 博客2013-02-12 13:44 分享到:我要吐槽 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相 ...
- 《O2O实战:二维码全渠道营销》读书笔记思维导图(530KB)
- js alert 封装 layui
方式一: var aaa = function(){ function _alert(aa){ layer.msg(aa, { time: 2000, //2s后自动关闭 alert("最高 ...
- Android进阶笔记13:ListView篇之ListView刷新显示(全局 和 局部)
一.ListView内容变化后,动态刷新的步骤(全局刷新): (1)更新适配器Adapter数据源:(不要使用匿名内部类) (2)调用适配器Adapter的刷新方法notifyDataSetChang ...