题意:给你一个序列,让你找长度最长的字典序最小和最大的单峰序列,单峰序列就是满足先增后降的序列。

思路:先正着求一遍LIS,再反着求一遍LIS,然后用单调栈来模拟。

求字典序最小的话,首先找到第一个顶峰,然后往前找递减的序列中下标较小的,往后就依次找,这样能保证字典序最小。

最大的话找到最后一个顶峰,往前是依次找,往后是找LIS中下标大的。

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int N = 3e5+;
int d[N],pos1[N],pos2[N],a[N],p[N],ans[N];
int main(){
int n;
while(~scanf("%d",&n)){
for(int i= ; i<=n ; i++)
d[i]=INF,p[i]=INF;
d[]=;
for(int i= ; i<=n ; i++){///正向LIS
scanf("%d",&a[i]);
pos1[i]=lower_bound(d+,d++n,a[i])-d;
d[pos1[i]]=a[i];
}
for(int i= ; i<=n ; i++)
d[i]=INF;
d[]=;
for(int i=n ; i>= ; i--){///反向LIS
pos2[i]=lower_bound(d+,d++n,a[i])-d;
d[pos2[i]]=a[i];
}
int now=,mx=pos1[]+pos2[],tot=;///找到最小秃顶
for(int i= ; i<=n ; i++)
{
if(pos1[i]+pos2[i]>mx){
mx=pos1[i]+pos2[i];
now=i;
}
}
///找字典序最小就是正找小反找大(仔细一想是这么一回事)
stack<int>st;
p[pos1[now]]=a[now];/// pos1[now]--长度的尾巴是a[now]
for(int i=now-;i>=;i--){
if(a[i]>=p[pos1[i]+]) continue;///排除不合格的条件 -> 6 5 (把6排除)
while(!st.empty()&&pos1[st.top()]<=pos1[i]) st.pop(); ///在可选的,选择下标小的
st.push(i);
p[pos1[i]]=a[i];
}
while(!st.empty()){
ans[++tot]=st.top();
st.pop();
}
ans[++tot]=now;
///反向最大就是一直调下去
for(int i=now+ ; i<=n ; i++){
if(pos2[i]==pos2[ans[tot]]-&&a[ans[tot]]>a[i])
ans[++tot]=i;
}
for(int i=;i<tot;i++)
printf("%d ",ans[i]); printf("%d\n",ans[tot]);
now=; mx=pos1[]+pos2[]; tot=;
for(int i=;i<=n;i++){///找到最大秃顶
if(pos1[i]+pos2[i]>=mx){
mx=pos1[i]+pos2[i];
now=i;
}
}
///找字典序最大就是正找大反找小
st.push(now);
for(int i=now-;i>=;i--){
if(pos1[i]==pos1[st.top()]-&&a[i]<a[st.top()]){
st.push(i);
}
}
while(!st.empty()){
ans[++tot]=st.top();st.pop();
} for(int i= ; i<=n ; i++)
p[i]=;
p[pos2[now]]=a[now]; for(int i=now+;i<=n;i++){
if(a[i]>=p[pos2[i]+]) continue;
while(tot>&&pos2[i]>=pos2[ans[tot]]) tot--;
ans[++tot]=i;
p[pos2[i]]=a[i];
}
for(int i=;i<tot;i++)
printf("%d ",ans[i]); printf("%d\n",ans[tot]);
}
return ;
}

HDU 6592 (LIS+输出字典序最大最小)的更多相关文章

  1. HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】

    <题目链接> 题目大意:给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用.现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且 ...

  2. hdu 1814 2-sat 输出字典最小的和任意序列的 模板题

    /* 思路:http://blog.csdn.net/string_yi/article/details/12686873 hdu 1814 输出字典序最小的2-sat */ #include< ...

  3. Peaceful Commission HDU - 1814(输出最小的一组解)

    Description 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条件: ...

  4. [Swift-2019力扣杯春季决赛]2. 按字典序排列最小的等效字符串

    给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符.举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' ...

  5. [leetcode](4.21)2. 按字典序排列最小的等效字符串

    给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符.举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' ...

  6. HDU 5224 Tom and paper(最小周长)

    HDU 5224 Tom and paper(最小周长) Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d &a ...

  7. hdu 1814 Peaceful Commission (2-sat 输出字典序最小的路径)

    Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. ZOJ-1456 Minimum Transport Cost---Floyd变形+路径输出字典序最小

    题目链接: https://vjudge.net/problem/ZOJ-1456 题目大意: Spring国家有N个城市,每队城市之间也许有运输路线,也可能没有.现在有一些货物要从一个城市运到另一个 ...

  9. poj 1041(欧拉回路+输出字典序最小路径)

    题目链接:http://poj.org/problem?id=1041 思路:懒得写了,直接copy吧:对于一个图可以从一个顶点沿着边走下去,每个边只走一次,所有的边都经过后回到原点的路.一个无向图存 ...

随机推荐

  1. JSP总结(jsp/EL表达式/核心标签)

    1.概念 jsp,即java Server Pages,java服务器页面. 2.简单介绍 小示例 <%@ page language="java" contentType= ...

  2. 深入IO 想学必看!受益匪浅哦~

    一:IO流概述 IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,Java对于数据的操作都是通过流实现,而Java用于操作流的对象都在IO包中. 分类: 按操作数据 ...

  3. 【Luogu P2201】【JZOJ 3922】数列编辑器

    题面: Description 小Z是一个爱好数学的小学生.最近,他在研究一些关于整数数列的性质. 为了方便他的研究,小Z希望实现一个叫做"Open Continuous Lines Pro ...

  4. 06: django+celery+redis

    目录: 1.1 Celery介绍 1.2 celery 组件 1.3 安装相关包 与 管理命令 1.4 celery与Django执行异步任务 1.5 在django中使用计划任务功能 1.1 Cel ...

  5. 区块链开源实现hyperledger fabric架构详解

    hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM.Intel.各大银行等贡献,目前v1.1版的kafka共识方式可达到1000/s次的吞吐量.本文中我们依次讨论:区块链 ...

  6. ArcGIS Server导出shp文件

    需求: 在项目中客户提出需要在Web端能够定义条件将后台的数据导出shp文件,并下载. 实现: 基于ArcGIS开发导出矢量数据的服务,用户输入导出数据类型.过滤条件.导出范围等条件,服务能够快速将相 ...

  7. mybatis报错(三)报错Result Maps collection does not contain value for java.lang.Integer解决方法

    转自:https://blog.csdn.net/zengdeqing2012/article/details/50978682 1 [WARN ] 2016-03-25 13:03:23,955 - ...

  8. mailto - 简单多媒体邮件发送程序

    SYNOPSIS mailto  [-a] [-c] [-s] [recipient name(s)] DESCRIPTION mailto 程序是一个用于发送MIME格式的多媒体邮件(MIME格式是 ...

  9. python 写matlab中的加性高斯白噪声AWGN

    定义 原始信号:x 噪声信号:n 信噪比:SNR 信号长度:N def wgn(x, snr): snr = 10**(snr/10.0) xpower = np.sum(x**2)/len(x) n ...

  10. libevent 网络库安装

    ./configure prefix=/tools/libevent make sudo make install