题目链接
[题意]
n 个数, m 个区间[l,r] 内 保证 不能重复, 但 相交区域外的可以重复, 问 最小字典序的 这样一个序列
[思路]
采用 Set 维护, Set 中 存放 1-n 表示可用的数字
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+100;
typedef pair<int,int> PII;
int main()
{
freopen("a.txt","r",stdin);
ios::sync_with_stdio(0)
int T;
cin>>T;
while(T --){
int n,m;
cin>>n>>m;
int i;
set<int>can;
set<int>::iterator it;
for(i = 1;i <= n;i ++) can.insert(i);
int ans[N];
memset(ans,0,sizeof(ans));
vector<PII>p;
for(i = 1;i <= m;i ++){
int x,y;
cin>>x>>y;
p.push_back(make_pair(x,y));
}
sort(p.begin(),p.end()); //对区间排序
int left = 1,now = 1;
for(i = 0;i < p.size();i ++){
for(;left < p[i].first;left++){
if(ans[left]!=0) can.insert(ans[left]); //更新可以使用的点
}
for(now = max(now,p[i].first);now <= p[i].second;now ++){ //填数
it = can.begin();
ans[now] = *it;
can.erase(it);
}
}
for(i = 1;i <= n;i ++){
if(ans[i]!=0)cout<<ans[i];
else cout<<'1';
if(i!=n)cout<<' ';
}
cout<<endl;
}
return 0;
}