K stack
题目大意:
给定数组
b
b
b 中的
k
k
k 个元素,其记录了栈的大小,而数组
a
a
a存储入栈的元素,当栈顶元素大于入栈元素时则弹出栈顶元素。
思路:
首先对于
b
b
b中元素,在一个
b
[
i
]
b[i]
b[i]不为0的元素之前的
b
b
b一定是
1
,
2
,
.
.
.
,
b
[
i
]
1 ,2, ... , b[i]
1,2,...,b[i]的子序列,所以我们干脆构造出一个合法的
b
b
b数组,对于这个数组,如果某处无值,那么我们就让他等于前一个数+1。
在构造完之后,我们还要判断该数组是否合法,显然,一个数大于他前一个数+1,则说明不合法,而且 b [ 1 ] b[1] b[1]肯定为1.
在检查之后,我们将整个 b b b数组从后往前遍历,我们将1…2…3…4依次放入单调栈中,再根据我们构造的数组b进行弹出即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<queue>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 1e6+10;
int b[N];
int a[N];
int st[N];
int main() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= k; i++) {
int p;
cin >> p ;
cin >> b[p];
}
for (int i = 1; i <= n; i++) {
if (b[i] == 0)b[i] = b[i - 1] + 1;
}
int flag = 0;
for (int i = 1; i < n; i++) {
if (b[i + 1] - b[i] > 1)flag = 1;
}
if (flag) {
puts("-1");
}
else {
int tt = 0, hh = 0;
for (int i = n; i >= 1; i--) {
while(b[i] > tt)st[++tt] = ++hh;
a[i] = st[tt--];
}
cout << a[1];
for (int i = 2; i <= n; i++)cout << ' ' << a[i];
cout << endl;
}
}