题意:m个限制条件[L,R]表示a[L:R]内的数任意两个都不能相同
n,m<=1e5.给出n构造出满足m个条件的最小字典序序列.
字典序最小,当前位置尽量小.设:pre[r]表示 限制中:端点r的最远左端点.
pre[r]是递增的 单指针维护,初始可以使用数为[1..n]. 根据set维护当前可以选择的最小数字(mex)即可.
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int T,n,m,pre[N],a[N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>T;
while(T--){
cin>>n>>m;
for(int i=1;i<=n;i++) pre[i]=i;
for(int i=1;i<=m;i++){
int l,r;
cin>>l>>r;
pre[r]=min(pre[r],l);
}
for(int i=n-1;i>=1;i--) pre[i]=min(pre[i],pre[i+1]);
set<int> se;
for(int i=1;i<=n;i++) se.insert(i);
int p1=1;
for(int i=1;i<=n;i++){
int le=pre[i];
while(p1<le){
se.insert(a[p1]);
p1++;
}
a[i]=*se.begin();
se.erase(a[i]);
}
for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n?'\n':' ');
}
return 0;
}