题目描述

对于一个给定的 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]上升序列(最长上升子序列)的更多相关文章

  1. shuoj1936-D序列—最长上升子序列

    Description 已知两个长度为N的数组A和B.下标从0标号至N-1. 如今定义一种D序列 (如果长度为L).这样的序列满足下列条件: 1. 0 <= D[i] <= N-1 2.  ...

  2. 【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数 ...

  3. 【动态规划】【最长上升子序列】【贪心】bzoj1046 [HAOI2007]上升序列

    nlogn求出最长上升子序列长度. 对每次询问,贪心地回答.设输入为x.当前数a[i]可能成为答案序列中的第k个,则若 f[i]>=x-k && a[i]>ans[k-1] ...

  4. 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹

    一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...

  5. HDU-4521 小明系列问题——小明序列 间隔限制最长上升子序列

    题意:给定一个长度为N的序列,现在要求给出一个最长的序列满足序列中的元素严格上升并且相邻两个数字的下标间隔要严格大于d. 分析: 1.线段树 由于给定的元素的取值范围为0-10^5,因此维护一棵线段树 ...

  6. 【LCS,LIS】最长公共子序列、单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  7. hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明

    题目:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11313 湖师大的比赛,见我的另一篇水题题解,这里要说的 ...

  8. C语言 · 最长公共子序列 · 最长字符序列

    算法提高篇有两个此类题目: 算法提高 最长字符序列   时间限制:1.0s   内存限制:256.0MB      最长字符序列 问题描述 设x(i), y(i), z(i)表示单个字符,则X={x( ...

  9. POJ - 2533 Longest Ordered Subsequence与HDU - 1257 最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)(LIS)

    Longest Ordered Subsequence A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let ...

随机推荐

  1. C# 判断List集合中是否有重复的项

    /*在.Net 3.5 以上*/ ).Count() >= ;

  2. java输出九九乘法口诀表

    使用双重for循环输出九九乘法口诀表 public static void main(String[] args){ formula();} /** * for 循环实现9*9乘法口诀表 * &quo ...

  3. 采用 ITextPDF 类库测试向 PDF 中加入图片的示例

    package com.smbea.image; import com.artup.util.image.ImageUtil; import com.itextpdf.text.*; import c ...

  4. IntelliJ IDEA 2017.3.5 安装 lombok-plugin-0.17 失败,通过网络下载总是超时

    1.问题: IntelliJ IDEA 2017.3.5 安装 lombok-plugin-0.17 失败,通过网络下载总是超时: 2.原因:IntelliJ IDEA 2017.3.5 目前还不支持 ...

  5. 隐藏 google 地图 Logo 隐藏 百度 地图 Logo

    Google 地图 var isFirstLoad=true; //地图瓦片加载完成之后的回调 google.maps.event.addListener(map, 'tilesloaded', fu ...

  6. @PathVariable @RequestParam @RequestBody等参数绑定注解详解

    一.分类 handler method 参数绑定常用的注解,我们根据他们处理的Request的内容不同分为四类: 处理request uri 部分的注解:   @PathVariable;(这里指ur ...

  7. Java NIO(三) Buffer

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  8. wx.grid.Grid

    # -*- coding: cp936 -*- import wx import wx.grid import wx.lib.gridmovers as gridmovers import pymss ...

  9. matlab 中“newff” 函数的参数设置

    matlab 中"newff" 函数的使用方法技巧|和各参数的意义 先来一个简单的源程序让大家练习一下: % Here input P and targets T define a ...

  10. Angular 5.x 学习笔记(1) - 模板语法

    Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...