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


京公网安备 11010502036488号