HDU 6592 (LIS+输出字典序最大最小)
题意:给你一个序列,让你找长度最长的字典序最小和最大的单峰序列,单峰序列就是满足先增后降的序列。
思路:先正着求一遍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+输出字典序最大最小)的更多相关文章
- HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】
<题目链接> 题目大意:给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用.现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且 ...
- hdu 1814 2-sat 输出字典最小的和任意序列的 模板题
/* 思路:http://blog.csdn.net/string_yi/article/details/12686873 hdu 1814 输出字典序最小的2-sat */ #include< ...
- Peaceful Commission HDU - 1814(输出最小的一组解)
Description 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条件: ...
- [Swift-2019力扣杯春季决赛]2. 按字典序排列最小的等效字符串
给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符.举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' ...
- [leetcode](4.21)2. 按字典序排列最小的等效字符串
给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符.举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' ...
- HDU 5224 Tom and paper(最小周长)
HDU 5224 Tom and paper(最小周长) Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d &a ...
- hdu 1814 Peaceful Commission (2-sat 输出字典序最小的路径)
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- ZOJ-1456 Minimum Transport Cost---Floyd变形+路径输出字典序最小
题目链接: https://vjudge.net/problem/ZOJ-1456 题目大意: Spring国家有N个城市,每队城市之间也许有运输路线,也可能没有.现在有一些货物要从一个城市运到另一个 ...
- poj 1041(欧拉回路+输出字典序最小路径)
题目链接:http://poj.org/problem?id=1041 思路:懒得写了,直接copy吧:对于一个图可以从一个顶点沿着边走下去,每个边只走一次,所有的边都经过后回到原点的路.一个无向图存 ...
随机推荐
- java 数组详细介绍
一.概述 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理 数组常见概念: 数组名, 下标(或索引), 元素, 数组的长度 数组本 ...
- windows和linux安装rabbitmq
一.windows安装rabbitmq 1.安装erlang 点击进入官网下载:http://erlang.org/download/ 2.安装rabbitmq 点击进入官网下载:http://www ...
- mysql,oracle,sql server数据库默认的端口号,端口号可以为负数吗?以及常用协议所对应的缺省端口号
mysql,oracle,sql server数据库默认的端口号? mysql:3306 Oracle:1521 sql server:1433 端口号可以为负吗? 不可以,端口号都有范围的,0~65 ...
- k3 cloud在站点中新增用户
1.进去金蝶云企业平台: 网址:https://cloud.kingdee.com/pt/ 2.进入控制台页面,我的产品下面选择添加用户 去cloud平台新增并同步用户注册信息 3.去管理中心更新用户 ...
- 《CSS权威指南》双鱼书概述——第一章CSS和文档
前言:CSS即层叠样式表 主要是影响一个或者一组文档的表现,没有文档,CSS毫无用处. 一.web的衰落 完全结构化的文本太过古板,太平常,虽然有N个理由要求使用结构化标记,但HTML已然走到了今天. ...
- 用HTTP核心模块配置一个静态Web服务器
静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module.n ...
- CSS的优先级理解
样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External styl ...
- 点击Listview列头排序
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) ListView1.Sorted = ...
- JS比较两个时间的时间差
/** * 比较两个时间的时间差 * @param startTime 开始时间 * @param endTime 结束时间 * @demo compareTime(new Date('2019-12 ...
- L3-015. 球队“食物链”
某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链 ...