后缀最大值

问题描述:
栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序。例如,借助一个栈,依次将数组 1,3,2 按顺序入栈或出栈,可对其从大到小排序:
1 入栈;3 入栈;3 出栈;2 入栈;2 出栈;1 出栈。
在上面这个例子中,出栈序列是 3,2,1,因此实现了对数组的排序。
遗憾的是,有些时候,仅仅借助一个栈,不能实现对数组的完全排序。例如给定数组 2,1,3,借助一个栈,能获得的字典序最大的出栈序列是 3,1,2:
2 入栈;1 入栈;3 入栈;3 出栈;1 出栈;2 出栈。
请你借助一个栈,对一个给定的数组按照出栈顺序进行从大到小排序。当无法完全排序时,请输出字典序最大的出栈序列。
输入格式:
输入共2行。
第一行包含一个整数�,表示入栈序列长度。
第二行包含�个整数,表示入栈序列。输入数据保证给定的序列是1到 n 的全排列,即不会出现重复数字。
输出格式:
仅一行,共�个整数,表示你计算出的出栈序列。
样例输入:
3
2 1 3
样例输出:
3 1 2

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
const int maxn=1000010;
int n,a[maxn],s[maxn];
stack<int> st;
int main()
{
    freopen("haha.in","r",stdin);
    freopen("haha.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(int i=n;i>=1;i--)
    s[i]=max(s[i+1],a[i]);
    for(int i=1;i<=n;i++)
    {
        st.push(a[i]);
        while(!st.empty()&&st.top()>=s[i+1])
        {
            printf("%d ",st.top());
            st.pop();
        }
    }
    while(!st.empty())
    {
        printf("%d ",st.top());
        st.pop();
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
原文地址:https://www.cnblogs.com/cax1165/p/6070908.html