【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】上升序列的更多相关文章

  1. [bzoj1046]上升序列

    以i为开头的最长上升子序列,那么就是反过来以i为结尾的最长下降子序列,预处理出来后,不断向后找到下一个数即可 1 #include<bits/stdc++.h> 2 using names ...

  2. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  3. 【bzoj1046】 HAOI2007—上升序列

    http://www.lydsy.com/JudgeOnline/problem.php?id=1046 (题目链接) 题意 给出一个数列,求数列中长度为L的下标字典序最小的上升子序列. Soluti ...

  4. 【BZOJ1046】[HAOI2007]上升序列

    [BZOJ1046][HAOI2007]上升序列 题面 bzoj 洛谷 题解 \(dp\)完之后随便搞一下即可,注意不要看错题 代码 #include <iostream> #includ ...

  5. 【BZOJ1046】上升序列(动态规划,贪心)

    [BZOJ1046]上升序列(动态规划,贪心) 题面 BZOJ 洛谷 题解 我一开始看错题了,一度以为是字典序最小的序列. 最后发现它要求的字典序是位置的字典序最小. 那就很好办了. 设\(f[i]\ ...

  6. 【BZOJ-1046】上升序列 DP + 贪心

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3723  Solved: 1271[Submit][Stat ...

  7. BZOJ1046 [HAOI2007]上升序列

    Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...

  8. 2014.8.15模拟赛【公主的工作】&&bzoj1046[HAOI2007]上升序列

    bzoj题目是这样的 Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm ...

  9. [BZOJ1046] [HAOI2007] 上升序列 (dp)

    Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...

随机推荐

  1. C#json 解析

    Json样例一: string jsonText= {Code)\/)\/"}}} JObject jo = JObject.Parse(jsonText); string strCode= ...

  2. android 入门 007(界面跳转)

    一.隐式跳转(自定义界面) 界面层: <Button android:id="@+id/sencond_contact" android:layout_width=" ...

  3. C# 错误代码

    附录B 错误CS0001 编译器内部错误 错误CS0003 内存溢出 错误CS0004 提升为错误的警告 错误CS0005 编译器选项后应跟正确的参数 错误CS0006 找不到动态链接的元数据文件 错 ...

  4. Java中Properties类的操作配置文件

    知识学而不用,就等于没用,到真正用到的时 候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用 Java来写, ...

  5. 【Web】写个HTML页面去调试HTTP接口方便些

    现在越来越多的系统基本SOA的思想,业务由许多小系统通过远程调用的方式串连起来,其中HTTP的接口在远程调用的方式中颇为常见.看过一些开发人员写完一些接口后,要么按照正常情况调用几次就交给调用方,要么 ...

  6. CAShapeLayer 与贝塞尔曲线

    一 CAShapeLayer 简介 1,CAShapeLayer继承至CALayer,可以使用CALayer的所有属性 2,CAShapeLayer需要与贝塞尔曲线配合使用才有意义:单独使用毫无意义 ...

  7. 【leetcode❤python】299. Bulls and Cows

    class Solution(object):    def getHint(self, secret, guess):        """        :type ...

  8. BZOJ 2324 营救皮卡丘(最小费用最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2324 题意:n+1个城市(0到n).初始时K个 人都在0城市.城市之间有距离.要求(1) ...

  9. spring事务管理-摘抄

    原著网址 http://gcq04552015.iteye.com/blog/1666570 Spring是以代理的方式实现对事务的管理.我们在Action中所使用的Service对象,其实是代理对象 ...

  10. C++实现有向权图的基本操作,界面友好,操作方便,运行流畅

    Ⅰ.功能: .创建图 .展示全图 .添加顶点 .添加边 .删除顶点 .删除边 .查看指定边权值 .修改指定边权值 .输出两点间的所有简单路及路径对应权值 .销毁图 ps:关于9,如果不存在任何简单路, ...