题目描述
给你一个栈和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 }