P2215 [HAOI2007]上升序列
题目描述
对于一个给定的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.
输入输出格式
输入格式:
第一行一个N,表示序列一共有N个元素
第二行N个数,为a1,a2,…,an
第三行一个M,表示询问次数。下面接M行每行一个数L,表示要询问长度为L的上升序列。
输出格式:
对于每个询问,如果对应的序列存在,则输出,否则打印Impossible.
输入输出样例
6
3 4 1 2 3 6
3
6
4
5
Impossible
1 2 3 6
Impossible
说明
数据范围
N<=10000
M<=1000
Solution:
本题简直有毒!数据包也有毒!~调了我好久啊!~
其实本题一个很简单的思路就是:
先暴力$O(n^2)$处理出以每一位为起点最长上升子序列的长度,那么直接该成倒序即可,这样$f[i]$就表示以$i$为起点最长上升子序列长度。
然后每次询问长度为$x$的上升子序列是否存在:当$x > L_{max}$时,则直接输出$Impossible$; 否则,由于题目要求下标字典序最小,那么贪心从前往后扫能输出就输出,即记录前一个的值,当前值大于上一个值时就输出。
代码:
#include<bits/stdc++.h>
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define il inline
using namespace std;
const int N=;
int n,m,x,a[N],f[N],mx[N];
il int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=a*+x-,x=getchar();
return f?-a:a;
}
int main(){
n=gi();
For(i,,n) a[i]=gi(),f[i]=;
mx[n]=;
Bor(i,,n-) {
For(j,i+,n)
if(f[i]>mx[i+]+)break;
else if(a[i]<a[j]&&f[i]<f[j]+)f[i]=f[j]+;
mx[i]=Max(mx[i+],f[i]);
}
m=gi();
while(m--){
x=gi();
if(x<=mx[]){
int p=-;
For(i,,n){
if(!x)break;
if(f[i]>=x&&a[i]>p)printf("%d ",a[i]),x--,p=a[i];
}
printf("\n");
}
else printf("Impossible\n");
}
return ;
}
P2215 [HAOI2007]上升序列的更多相关文章
- P2215 [HAOI2007]上升序列 DP
这个字典序海星 思路:\(DP\) 提交:4次 错因:刚开始把字典序理解错了,怒看题解一脸懵逼:后来往前跳的时候又没有管上升\(QwQ\)窝太菜了. 题解: 所谓的字典序是相对位置!!!而不是元素本身 ...
- BZOJ 1046: [HAOI2007]上升序列 LIS -dp
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3438 Solved: 1171[Submit][Stat ...
- 【BZOJ 1046】 1046: [HAOI2007]上升序列
1046: [HAOI2007]上升序列 Description 对于一个给定的S={a1,a2,a3,-,an},若有P={ax1,ax2,ax3,-,axm},满足(x1 < x2 < ...
- 【BZOJ】1046 : [HAOI2007]上升序列
1046: [HAOI2007]上升序列 题意:给定S={a1,a2,a3,…,an}问是否存在P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且 ...
- Bzoj 1046: [HAOI2007]上升序列 二分,递推
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3671 Solved: 1255[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+递归】
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4987 Solved: 1732[Submit][Stat ...
- 【BZOJ1046】[HAOI2007]上升序列
[BZOJ1046][HAOI2007]上升序列 题面 bzoj 洛谷 题解 \(dp\)完之后随便搞一下即可,注意不要看错题 代码 #include <iostream> #includ ...
随机推荐
- UISearchController(使用)
效果图1 效果图2 其实一般是在第一种情况使用的UISearchController,但是第二种情况这种又懒得去用uisearchbar+uitableview等等去处理, 其实主要是对数据源的合理使 ...
- 学习vue-cli3的项目搭建
安装 关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli(1.x 或 2.x),你需要先通过 npm uninstall ...
- 浅谈mysql权限
一. 背景: “去IOE”的本质是“分布式+开源”架构替代“集中式+封闭”架构,变成彻底的云计算服务模式.去“IE”易,并且应该去,关键确实能省钱,而且运维难度不大,替代技术产品成熟.而去O ...
- 面向对象封装的web服务器
import socket import re import os import sys # 由于前面太繁琐,可以用类封装一下,也可以分几个模块 class HttpServer(object): d ...
- tcl之控制流-for
- .c和.h区别
本质没有区别: .h是头文件 一般情况下下边内容放在.h文件中 宏定义 结构体,联合,枚举声明 typedef声明 外部函数声明 全局变量声明 .c是程序文件 一般情况下下边内容放在.h文件中 内含函 ...
- 裸机——I2C
网上搜了些资料,碍于智商和基础,看不懂, 只有将S5PV210 数据手册关于I2C的部分,翻译记录下,留到以后用. 1.OVERVIEW The S5PV210 RISC microprocessor ...
- Educational Codeforces Round 42D. Merge Equals(STL)
D. Merge Equals time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 7-1 寻找大富翁 PTA 堆排序
7-1 寻找大富翁 (25 分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁. 输入格式: 输入首 ...
- MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':ge
数据库表里命名有这个字段,可怎么就是报错呢,大神的解释: 加上之后立马好用!!!