【问题描述】

栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序。例如,借助一个栈,依次将数组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 }

最新文章

  1. java 反编译
  2. swift开发多线程篇 - 多线程基础
  3. C# ref的应用
  4. PowerDesigner增强
  5. StreamReader和StreamWrite和FileStream区别和用法
  6. windows2008 设置会话超时时间
  7. Git - Download for Linux and Unix
  8. 201521123087《java程序设计》第13周学习总结
  9. Linux网络编程--wireshark分析TCP包头的格式
  10. myBatis源码学习之SqlSessionFactory
  11. js变量污染引起的诡异bug
  12. Ubuntu安装Hadoop
  13. js的事件冒泡,事件捕获
  14. jar文件放在桌面上双击启动不了,但放在其它任何文件夹里都可以双击启动
  15. phpstorm 2017激活码(方法)
  16. textrank的方法,大概懂了
  17. adi 程序烧写
  18. 2018C语言第三次作业
  19. JSP EL简介
  20. mysql开启查询日志功能

热门文章

  1. Hi,这里是我的2020年,请查收!
  2. Python 爬虫系列
  3. Lambda 表达式实例
  4. ECMAScript概述及浅谈const,let与块级作用域
  5. js概念和ECMAScript
  6. Openstack neutron 网络服务 (七)
  7. 【Git】5、Git如何提交代码到远程仓库
  8. DNS基础概要
  9. 记录Js动态加载页面.append、html、appendChild、repend添加元素节点不生效以及解决办法
  10. C# 合并和拆分PDF文件