题目大意:将所给的分段分成两个非空集合,使得一个集合中的任何一个分段与另一个集合中的任何一个分段不相交。
解题思路:让 l 从小到大排序,用 rr 记录第一个集合的右边界,若第 i 个分段的 l 小于等于第一个集合的右边界,那么将第 i 个分段划分到第一个集合,新的 rr 值为 max(rr, 第 i 个分段的 r 值 );若第 i 个分段的 l 大于第一个集合的右边界,那么从第 i 个分段开始为第二个集合。
#include <iostream>
#include <cstdio>
#include <queue>
#include <string>
#include <algorithm>
#include <set>
using namespace std;
struct node{
int l,r;
int id;
int group;
}a[1000];
int t,n;
bool cmp1(node a,node b){
if(a.l==b.l)
return a.r<b.r;
return a.l<b.l;
}
bool cmp2(node a,node b){
return a.id<b.id;
}
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].l>>a[i].r;
a[i].id=i;
}
sort(a,a+n,cmp1);
int mid=-1;
int rr=a[0].r;
for(int i=1;i<n;i++){
if(a[i].l>rr){
mid=i;
break;
}else{
rr=max(rr,a[i].r);
}
}
if(mid==-1){
cout<<"-1"<<endl;
}else{
for(int i=0;i<mid;i++)
a[i].group=1;
for(int i=mid;i<n;i++)
a[i].group=2;
sort(a,a+n,cmp2);
for(int i=0;i<n;i++){
cout<<a[i].group<<" ";
}
cout<<endl;
}
}
}