输入
5 2
2 2
5 4
输出
1 2 5 3 4
输入
10 1
1 10
输出
-1
AC代码
#include <queue>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
const int N=1e6+10;
stack<int> stk;
vector<int>edge[N];
int b[N],in[N],a[N];
int main() {
int n,k,p,x;
cin>>n>>k;
for(int i=1; i<=k; i++) {
cin>>p>>x;
b[p]=x;
}
int cnt=0;
for(int i=1; i<=n; i++) {
cnt++;
if(!b[i]) {
stk.push(i);
continue;
}
if(stk.size()+1<b[i]) {
cout<<"-1";
return 0;
}
while(stk.size()+1>b[i]) {
int tt=stk.top();
stk.pop();
edge[i].push_back(tt);
in[tt]++;
}
stk.push(i);
}
priority_queue<int,vector<int>,greater<int>>q;
for(int i=1; i<=n; i++)
if(!in[i])
q.push(i);
int idx=1;
while(q.size()) {
int tt=q.top();
q.pop();
a[tt]=idx;
idx++;
for(int i=0; i<edge[tt].size(); i++) {
in[edge[tt][i]]--;
if(!in[edge[tt][i]]) q.push(edge[tt][i]);
}
}
for(int i=1; i<=n; i++) {
cout<<a[i]<<" ";
}
}