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吧:对于一个图可以从一个顶点沿着边走下去,每个边只走一次,所有的边都经过后回到原点的路.一个无向图存 ...
随机推荐
- RHEL 无图形界面安装oracle 11gr2
RHEL7.3 无图形界面安装oracle 11gr2 使用纯命令安装方式.提供RHEL全量系统镜像. 1.oracle官方下载地址:https://www.oracle.com/techne ...
- Java Springboot 根据图片链接生成图片下载链接 及 多个图片打包zip下载链接
现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式. 现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载.由于前端存在跨域问题, ...
- Phone List POJ-3630 字典树 or 暴力
Phone List POJ-3630 字典树 or 暴力 题意 目前有 t 组数据, n 个电话号码,如果拨打号码的时候 先拨通了某个号码,那么这一串号码就无法全部拨通. 举个例子 911 和 91 ...
- ARM编程模式和7钟工作模式
一. ARM的基本设定 1.1. ARM 采用的是32位架构 1.2. ARM约定: a. Byte : 8 bits b. Halfword :16 bits (2 byte) c. Word : ...
- mysql 修改表字段默认值
alter table 表名 alter column 字段名 drop default; (若本身存在默认值,则先删除) alter table 表名 alter column 字段名 set de ...
- Python链表倒置的两种方法
实现链表的翻转: 思路一: def reverse(self): """ 翻转链表的第一种思路:依次改变结点的指向,将结点指向此结点的上一个结点,并使用pre来指向这个节 ...
- ajax实现异步请求模态登陆
ajax实现模态登陆 j2ee课程项目实现 Ajax 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创 ...
- bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)
内存限制:512 MiB 时间限制:1000 ms 题目描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi ...
- spring security OAuth2.0之客户端Client的实现
项目代码:https://github.com/hankuikuide/microservice-spring-security-oauth2 网上多数的项目客户端都是采用纯js写,或用postman ...
- MySQL索引原则和慢查询优化步骤
建索引的几大原则 1.最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>.<.between.like)就停止匹配. 2.=和in可以乱序,比如a = 1 and b = 2 ...