【问题描述】

栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序。例如,借助一个栈,依次将数组1,3,2按顺序入栈或出栈,可对其从大到小排序:

1入栈;3入栈;3出栈;2入栈;2出栈;1出栈。

在上面这个例子中,出栈序列是3,2,1,因此实现了对数组的排序。

遗憾的是,有些时候,仅仅借助一个栈,不能实现对数组的完全排序。例如给定数组2,1,3,借助一个栈,能获得的字典序最大的出栈序列是3,1,2:

2入栈;1入栈;3入栈;3出栈;1出栈;2出栈。

请你借助一个栈,对一个给定的数组按照出栈顺序进行从大到小排序。当无法完全排序时,请输出字典序最大的出栈序列。

【输入格式】

输入共行。

第一行包含一个整数,表示入栈序列长度。

第二行包含个整数,表示入栈序列。输入数据保证给定的序列是到n的全排列,即不会出现重复数字。

【输出格式】

仅一行,共个整数,表示你计算出的出栈序列。

【样例输入】

3

2 1 3

【样例输出】

3 1 2

【样例解释】

这回山里有座塔。

【数据规模与约定】

对于的数据(30%),103

对于的数据(60%),105

对于的数据(100%),106

____________________________________________________________________________

一读题目就知道用贪心,找出序列中最大的,输出,前面的入栈,然后比较栈顶和未入栈最大元素的大小,如果栈顶大则输出栈顶所有大的元素,否则重复上面的步骤,继续把剩余未入栈的最大元素前的栈,输出……直到所有元素输出。

可是发现不可能过所有的点,关键在于找未入栈的最大元素比较耗费时间。区间求最大值,RMQ,可是很难写,忘的差不多了。于是,冥思苦想后,单调队列。

题目中并不是求任意区间的最大值(1),而是求已知最大值的右侧区间的最大值(2),而这个最大值(2)一定不比最大值(1)大,也就是小于等于,因此符合单调性。

—————————————————————————————————————————————————

 1 #include<cstdio>
2 #include<iostream>
3 #include<cstring>
4
5 using namespace std;
6 int sz[1000010],n;
7 int stk[1000010],top=-1;
8 int que[1000010],tail=-1,head=-1;
9 void readint(int &x)
10 {
11 char c=getchar();
12 for(;c>'9'||c<'0';c=getchar());
13 x=0;
14 for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
15 }
16 void pushq(int x)
17 {
18 while(tail>-1&&que[tail]<x)tail--;
19 tail++;
20 que[tail]=x;
21 }
22 bool qk()
23 {
24 return tail==head;
25 }
26 int main()
27 {
28 freopen("haha.in","r",stdin);
29 freopen("haha.out","w",stdout);
30 readint(n);
31 for(int i=0;i<n;i++)
32 {
33 readint(sz[i]);
34 pushq(sz[i]);
35 }
36 int q,i=0;
37 while(!qk())
38 {
39 while(sz[i]!=que[head+1])
40 stk[++top]=sz[i],i++;
41 printf("%d ",sz[i]);
42 head++;i++;
43 if(!qk())
44 while(top>=0&&stk[top]>que[head+1])
45 printf("%d ",stk[top--]);
46 }
47 while(top>=0)
48 printf("%d ",stk[top--]);
49 fclose(stdin);
50 fclose(stdout);
51 return 0;
52 }

济南学习D1T1_haha的更多相关文章

  1. 济南学习D3T1__线性筛和阶乘质因数分解

    [问题描述] 从1− N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少. [输入格式] 第一行一个数字N. [输出格式] 一行,一个整数代表答案对100000007取模之后的 ...

  2. 济南学习D2T1__折纸带

    他[问题描述]一张长度为n的纸带,我们可以从左至右编号为0 −n(纸带最左端标号为0) .现在有m次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带的长度是多少.[输入格式]第一行两个数字n, ...

  3. 济南学习D2T2__数学分析题

    [问题描述]有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[l,r]中则你比较厉害.求你比较厉害的概率.[输入格式]第一行有三个数N,l,r,含义如上描述.接下来一行有N个数代表每一个数的 ...

  4. 济南学习 Day 5 T1 pm

    欧拉函数(phi)题目描述: 已知(N),求phi(N). 输入说明: 正整数N. 输出说明: 输出phi(N). 样例输入: 8 样例输出: 4 数据范围: 对于20%的数据,N<=10^5 ...

  5. 济南学习 Day 4 T1 pm

    幸运数字(number)Time Limit:1000ms Memory Limit:64MB题目描述LYK 最近运气很差,例如在 NOIP 初赛中仅仅考了 90 分,刚刚卡进复赛,于是它决定使用一些 ...

  6. 济南学习 Day 4 T2 am

    LYK 与实验室(lab)Time Limit:5000ms Memory Limit:64MB题目描述LYK 在一幢大楼里,这幢大楼共有 n 层,LYK 初始时在第 a 层上.这幢大楼有一个秘密实验 ...

  7. 济南学习 Day 4 T1 am

    完美的序列(sequence)Time Limit:1000ms Memory Limit:64MB题目描述LYK 认为一个完美的序列要满足这样的条件:对于任意两个位置上的数都不相同.然而并不是所有的 ...

  8. 济南学习 Day 3 T3 pm

    仙人掌(cactus)Time Limit:1000ms Memory Limit:64MB题目描述LYK 在冲刺清华集训(THUSC) !于是它开始研究仙人掌,它想来和你一起分享它最近研究的结果. ...

  9. 济南学习 Day 3 T2 pm

    LYK 快跑!(run)Time Limit:5000ms Memory Limit:64MB题目描述LYK 陷进了一个迷宫! 这个迷宫是网格图形状的. LYK 一开始在(1,1)位置, 出口在(n, ...

随机推荐

  1. 8种常被忽视的SQL错误用法,你中招了吗?

    前言 MySQL在近几年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在 MySQL 数据库之上,甚至是从 Oracle 迁移到 MySQL上来.但也存在部分客户在使用 MySQL ...

  2. 如何根据角色批量激活SAP Fiori服务

    我们知道Fiori的角色跟ERP的角色是不通用的,即使你的账号有SAP_ALL的权限,但打开Fiori的时候一样是空的一片: 只有给账号加上fiori需要的角色,并激活相关服务才能用fiori app ...

  3. mapboxgl实现带箭头轨迹线

    最近在使用mapboxgl实现轨迹展示时,想实现类似高德地图导航轨迹效果,然而并未在网上找到类似示例.经一番研究与尝试,最终解决,效果如下. 添加箭头核心代码如下,只需在配置layout中添加symb ...

  4. Linux 下 swap 分区及作用详解

    我们在安装系统的时候已经建立了 swap 分区.swap 分区是 Linux 系统的交换分区,当内存不够用的时候,我们使用 swap 分区存放内存中暂时不用的数据.也就是说,当内存不够用时,我们使用 ...

  5. [Skill] git下载助手

    缘由 某些时候需要下载git项目中的某个独立的文件或者文件夹下的内容,克隆全部速度过于慢 搜索下发现有开源的实现,特此记录下 方案 国内不便于fq 源码 服务地址 国外原作者 源码 服务地址 使用方法 ...

  6. WPF DataGrid与ListView性能对比与场景选择

    开门见山的说 性能对比: 在Demo中,DataGrid与ListView默认开启虚拟化(可以理解为动态渲染,类似懒加载只渲染屏幕可以看见的地方) DataGrid渲染10列50行随机字符280ms ...

  7. Java向指定Excel写入读取数据

    今天在开发中遇到用户列表导入导出的功能实现,这里了解到使用POI函数库可以完成此任务!特此记录一下 POI Apache POI是Apache软件基金会开放的源码函数库,POI提供API给Java程序 ...

  8. linux线程库

    linux 提供两个线程库,Linux Threads 和新的原生的POSIX线程库(NPTL),linux threads在某些情况下仍然使用,但现在的发行版已经切换到NPTL,并且大部分应用已经不 ...

  9. Mybatis 一级缓存和二级缓存的使用

    目录 Mybatis缓存 一级缓存 二级缓存 缓存原理 Mybatis缓存 官方文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache My ...

  10. 【Linux】ssh设置了密钥,但ssh登陆的时候还需要输入密码

    ------------------------------------------------------------------------------------------------- | ...