K. Stack


题面:有n个数,依次加进栈中,每次加入前将栈顶比a[i]大的所有元素弹掉,加入后b[i]记为栈的大小。
现在给你若干时刻单调栈的大小,让你求a数组的一种合法方案,其中1~n在a中各出现了一次。
解析:设若没提及单调栈大小,则为前一时刻栈大小加一。若比已知单调栈要小,则不存在。即构造出了b数组。
之后构造a,从后往前扫
对于每个点:
若栈中数的个数小于b[i],将1到n的数分别入栈。
此时栈顶就是答案
出栈。

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[1000006];
int main(){
    cin>>n>>k;
    for(int i=1;i<=k;i++)
    {
        int x,y;
        cin>>x>>y;
        a[x]=y;
    }
    for(int i=1;i<=n;i++){
        if(a[i]==0) a[i]=a[i-1]+1;
        if(a[i]>a[i-1]+1) {
            cout<<"-1";
            return 0;
        }
    }
    stack<int> s;
    int t=1;
    for(int i=n;i>0;i--){
        while(s.size()<a[i]) s.push(t++);
        a[i]=s.top();
        s.pop();
    }
    for(int i=1;i<=n;i++)
    cout<<a[i]<<" ";
}