T4312 最大出栈顺序

2018-06-17 22:39:45来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

题目描述

给你一个栈和n个数,按照n个数的顺序入栈,你可以选择在任何时候将数

出栈,使得出栈的序列的字典序最大。

输入输出格式

输入格式:

输入共2行。

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

第二行包含n个整数,表示入栈序列。

输出格式:

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

输入输出样例

输入样例#1:
3
2 1 3
输出样例#1:
3 1 2

说明

对于100%的数据, 1 ≤ n≤ 10 6 , 所有读入的数字互不重复即一定是个排列。

 

 1 #include <cstdio>
 2 #include <stack>
 3 using namespace std;
 4 int const MAX = 1e6 + 2;
 5 int cur[MAX], pos[MAX], num[MAX];
 6 stack <int> s;
 7 int main()
 8 {
 9     int n;
10     scanf("%d",&n);
11     for(int i=0;i<n;i++)
12         scanf("%d", &num[i]);
13     for(int i=n;i>0;i--) 
14     {
15         if(cur[i] > num[i - 1])
16         {
17             cur[i - 1] = cur[i];
18             pos[i - 1] = pos[i];
19         }
20         else
21         {
22             cur[i - 1] = num[i - 1];
23             pos[i - 1] = i - 1;
24         }
25     }
26     for(int j = 0, i = 0; i < n; i++)
27     {
28         if(s.empty() || s.top() < cur[j])
29         {
30             for(int k = pos[j]; j <= k; j++)
31                 s.push(num[j]);
32         }
33         if(i != n - 1)
34         {
35             printf("%d ", s.top());
36             s.pop();
37         }
38         else
39             printf("%d\n", s.top());
40     }
41 }

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:1080 线段树练习

下一篇:bzoj4881 [ Lydsy2017年5月月赛 ] -- 二分图染色+线段树