[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 ...
随机推荐
- 2017年9月22日 关于JS数组
JS数组 JS数组的定义方法 var arr = []; var arr = new Array() JS数组属性 长度 arr.length 遍历数组 索引值:从0开始数 第一种方法 for(var ...
- 正则表达式验证问题(用户名、密码、email、身份证
实现的代码如下: <html> <head> <meta charset="UTF-8"> </head> <body> ...
- Java中Date()类 日期转字符串、字符串转日期的问题(已解决)
Java中Date()类 日期转字符串.字符串转日期的问题 今天在写东西的时候突然发现一个问题,就是先new 一个Date()然后将生成的值转为字符串, 然后再将转换后的字符串再次用new Date( ...
- Django组件——forms组件
一.校验字段功能 通过注册用户这个实例来学习校验字段功能. 1.模型:models.py from django.db import models # Create your models here. ...
- easyui datagrid 获取行数据某个字段
首先要能获取datagrid 的row对象 即:var row = $('#datagrid').datagrid('getData').rows[index]; 之后我们就可以通过类似row.nam ...
- Zepto结合Swiper的选项卡
我们昨天说了关于Angular的选项卡,那今天就说一下Swiper的选项卡吧! 今天的选项卡是Zepto结合Swiper的选项卡,咱么明天再说纯纯的Swiper的吧! 既然是关于Zepto和Swipe ...
- Swiper双向轮播
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 01_Redis基础
[Redis定义(参考了百度百科)] Redis是一个key-value存储系统.与Memchached类似,Redis支持的value类型更多,包括String.list.set.zset(有序集合 ...
- Struts1.x 中处理乱码及通过标签显示数据
1.通过filter解决乱码问题 网页的请求到达之前,先要经过filter的处理: 提取数据出现乱码:request.setCharacterEncoding("UTF-8"); ...
- solidity语言8
输入参数 pragma solidity ^0.4.16; contract Simple { function taker(uint _a, uint _b) public pure { // do ...