构造解的问题太难了,,,看了好久没有注释的大佬代码,才大概清楚了,,
根据题目给的伪代码,我们可以知道,栈中的元素个数是单调不减的,并且栈中元素个数绝对不会超过遍历的下标i(下标从1开始),如果超过就不存在解,那么这又有什么用呢,,既然是单调不减的,那么我们可以把位置的栈元素个数求出来,剩下的看代码,不太好表达出来。。其实就是还没完全懂
AC代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
int n,k;
cin >> n >> k;
vector<int> b(n+1);
int q,v;
for(int i = 1;i<=k;i++){cin >> q >> v; b[q] = v;} //先把已经知道的放入对应的位置
int cnt = 0;
for(int i = 1;i<=n;i++){ //因为是单调不减的,所以我们可以把每个位置在栈中的个数求出来
cnt++;
if(b[i] > 0){
if(b[i] > cnt){ //当前位置的栈元素个数绝对不会超过cnt,超过了就说明不存在
cout << -1 << endl;
return 0;
}
cnt = b[i];//保持单调不减的性质
}else b[i] = cnt;
}
vector<int> ans(n+1);
for(int i = 1;i<=n;i++){
ans[b[i]]++;//把每个栈元素个数出现的次数求出来
}
for(int i = 1;i<=n;i++) ans[i] += ans[i-1]; //构造解,这里就不太好理解了
for(int i = 1;i<=n;i++) cout << ans[b[i]]-- << " \n"[i == n];
return 0;
}