【bzoj1046】上升序列
【bzoj1046】上升序列
题意
对于一个给定的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.
\(1\leq n\leq 10000,1\leq m\leq 1000\)
分析
观察数据范围和时限:10s,支持\(O(n^2)\)
假如不要求最小字典序,那么就是dp傻题了。
最小字典序的处理方法,就是从后往前,倒序处理\(f\)数组。
\(f[i]\)表示以\(i\)为终点的从\(i\)之后出发的最长上升序列的最大长度,\(pre[i]\)表示以\(i\)为\(f[i]\)从哪个位置推过来的。
处理的时候尽可能选后面的。
然后对于每个询问,貌似...
找到第一个\(x\)满足\(f[x]>=Li\),然后根据\(pre\)输出\(Li\)个就行了?
尝试能不能找到错误。
发现还可能真的有错误。
因为我们的\(f\)是在子序列尽可能长的情况下满足最小字典序的,子序列尽可能长,这可能会存在更短的子序列,而字典序更小。
所以只能从头到尾重新扫一遍就好啦。
遇到一个\(f[x]\geq Li\),就说明取当前这个有解,且当前这个\(x\)最小,\(Li--\)。
不断输出。
这时候pre根本不需要了。
Extended:
如果要求\(a_i\)字典序怎么办?
方案:按照两个关键字\((a_i,i)\)从小到大排序,和上面的思路相同,要求在后面,逐个尝试。
小结
(1)关于字典序
字典序最小/最大的处理方法:逆序处理。
然后输出就按照自己的记录,或者逐个贪心输出。
代码
#include <cstdio>
#include <cctype>
#include <climits>
#include <algorithm>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)
const int N=16384;
const int MIN=INT_MIN;
int n;
int a[N];
int f[N];
int cnt;
int m;
int rd(void) {
int x=0,f=1; char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
void Solve(int c) {
int lastF=MIN;
rep(i,1,n)
if (lastF<a[i]&&f[i]>=c) {
printf("%d",a[i]);
if (c==1) printf("\n"); else printf(" ");
lastF=a[i],c--;
if (!c) break;
}
}
int main(void) {
#ifndef ONLINE_JUDGE
freopen("bzoj1046.in","r",stdin);
freopen("bzoj1046.out","w",stdout);
#endif
n=rd();
rep(i,1,n) a[i]=rd();
per(i,n,1) {
f[i]=1;
rep(j,i+1,n)
if (a[i]<a[j])
f[i]=max(f[i],f[j]+1);
}
cnt=*max_element(f+1,f+n+1);
m=rd();
rep(i,1,m) {
int x=rd();
if (x>cnt)
printf("Impossible\n");
else Solve(x);
}
return 0;
}
【bzoj1046】上升序列的更多相关文章
- [bzoj1046]上升序列
以i为开头的最长上升子序列,那么就是反过来以i为结尾的最长下降子序列,预处理出来后,不断向后找到下一个数即可 1 #include<bits/stdc++.h> 2 using names ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- 【bzoj1046】 HAOI2007—上升序列
http://www.lydsy.com/JudgeOnline/problem.php?id=1046 (题目链接) 题意 给出一个数列,求数列中长度为L的下标字典序最小的上升子序列. Soluti ...
- 【BZOJ1046】[HAOI2007]上升序列
[BZOJ1046][HAOI2007]上升序列 题面 bzoj 洛谷 题解 \(dp\)完之后随便搞一下即可,注意不要看错题 代码 #include <iostream> #includ ...
- 【BZOJ1046】上升序列(动态规划,贪心)
[BZOJ1046]上升序列(动态规划,贪心) 题面 BZOJ 洛谷 题解 我一开始看错题了,一度以为是字典序最小的序列. 最后发现它要求的字典序是位置的字典序最小. 那就很好办了. 设\(f[i]\ ...
- 【BZOJ-1046】上升序列 DP + 贪心
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3723 Solved: 1271[Submit][Stat ...
- BZOJ1046 [HAOI2007]上升序列
Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...
- 2014.8.15模拟赛【公主的工作】&&bzoj1046[HAOI2007]上升序列
bzoj题目是这样的 Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm ...
- [BZOJ1046] [HAOI2007] 上升序列 (dp)
Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...
随机推荐
- Linux各发行版本简介
简介 Linux 主要作为Linux发行版(通常被称为"distro")的一部分而使用.这些发行版由个人,松散组织的团队,以及商业机构和志愿者组织编写.它们通常包括了其他的系统软件 ...
- mysq 安装时候进行生成数据库系统时候执行语句 ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql 时候报错
我在安装数据库时候在系统进行生成数据库时候出现下面问题,就是在 scripts里面mysql_install_db没有执行权限, 进入到scripts目录下,执行chmod 777 mysql_ins ...
- PHP 对字符串进行十六进制替换 invalid character in attribute value
最近在xml传输过程中遇到字符串报错,表面看上去没有任何错误.将文件用winhex打开,看到对应字符串中多了'1F'.xml无法解析'1F'.随后在代码中将这个替换掉. $str = pack(&qu ...
- CodeForces 451C Predict Outcome of the Game
Predict Outcome of the Game Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d &a ...
- 专题:php页面跳转方法
php只有一种方法,利用JavaScript的window.location[和window.location.href效果相同]是一种方法,利用html的meta的Refresh是一种方法. 代码 ...
- D django 用户认证系统
django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...
- application 网站计数器
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- [SAP ABAP开发技术总结]ABAP程序之间数据共享与传递
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Codeforces Round #287 (Div. 2) C. Guess Your Way Out! 思路
C. Guess Your Way Out! time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 保存会话数据——session学习
Session:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资 ...