题目
思路:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 1e6 + 5, inf = 1e18, maxm = 4e4 + 5;
const int N = 1e6;
const int mod = 1e9 + 7;
// const int mod = 998244353;
//const __int128 mod = 212370440130137957LL;
// int a[1005][1005];
// bool vis[505][505];
int n, m;
int a[maxn];
//int b[maxn];
string s;
// struct Node{
// int a, b;
// // int val, id;
// bool operator<(const Node &u)const{
//
// }
// }node[maxn];
//long long ? maxn ? n? m?
void solve(){
int res = 0;
int k;
cin >> n >> k;
vector<int> b(n + 5, 0);
for(int i = 1; i <= k; i++){
int p, x;
cin >> p >> x;
b[p] = x;
}
for(int i = 1; i <= n; i++){
if(b[i]){
for(int j = i - 1; j >= 1; j--){
if(b[j]) break;
b[j] = max(1LL, b[j + 1] - 1);
}
}
}
for(int i = 1; i <= n; i++){//防止没给出 b[n],因为之前只往左放
if(!b[i]) b[i] = b[i - 1];//后面全部赋值为最右的给定的b[i], 这样a数组后面这段构造为逆序就可以满足条件
}
bool ok = b[1] == 1;
for(int i = 2; i <= n; i++){
if(b[i] - b[i - 1] > 1){
ok = 0;
break;
}
}
if(!ok){
cout << -1 << '\n';
return;
}
vector<int> p(n);
iota(p.begin(), p.end(), 1);//从1开始
// for(int i = 0; i < n; i++){
// p[i] = i + 1;
// }
sort(p.begin(), p.end(), [&](int i, int j){
if(b[i] != b[j]) return b[i] < b[j];
return i > j;
});
int cur = 1;
vector<int> ans(n + 5);
for(auto x : p){
ans[x] = cur++;
}
for(int i = 1; i <= n; i++){
cout << ans[i] << " \n"[i == n];
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}