题意:
给你m个区间,他的要求是这个区间内不能存在相同的字符。
序列长度共为n,元素为1到n。
问你符合要求的最小字典序的序列。
POINT:
先给区间按L从小到大排序,
可以先把1到n个元素全部放入set。然后开一个pre指针(假),每次跑到当前区间的L-1,在这之前的元素都可以返回set。
遍历L-R区间,然后每次放set中的begin。 就这样贪心的放置。
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
const int maxn=1e5+10;
set<int> st;
struct node
{
int l,r;
}e[maxn];
int cmp(node a,node b)
{
if(a.l==b.l) return a.r>b.r;
return a.l<b.l;
}
int a[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&e[i].l,&e[i].r);
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=n;i++){
a[i]=0;
st.insert(i);
}
int cs=1;
int pre=1;
for(int i=1;i<=m;i++){
if(e[i-1].l==e[i].l) continue;
while(pre<e[i].l){
if(a[pre]!=0)
st.insert(a[pre]);
else
a[pre]=1;
pre++;
}
cs=max(pre,cs);
for(int j=cs;j<=e[i].r;j++){
if(a[j]==0){
a[j]=*st.begin();
st.erase(st.begin());
}
}
cs=max(cs,e[i].r+1);
}
for(int i=cs;i<=n;i++)
a[i]=1;
for(int i=1;i<=n;i++){
printf("%d%c",a[i],i==n?'\n':' ');
}
}
return 0;
}