给你一个栈和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 }