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]<<" "; }