題目鏈接:
題意描述:
給出n個閉區間,要求把n個區間分成兩組,使兩組沒有公共點。
輸入:
第一行樣例數T
隨後T組樣例,每個樣例第一行一個n,隨後n行每行兩個數l,r
輸出:
按所給順序輸出每個區間的分組,1代表第一組,2代表第二組。多種可能分組,隨意輸出一種。(SPJ)
思路:
這場CF真的給做自閉了,B題少判斷一種情況被人hack,卡C題後面簽到題E題很晚才過,最後十分鐘意識到C的思路是錯的,不是找一個孤立區間,剩下的全分到一組。。然而來不及改了。。C也沒做出來,只過了兩題???瘋狂掉分。。。
至於這道C題,賽後趴桌子上想了沒幾分鐘就想出了正確做法:
所有區間按l大小排個序,然後把第一個區間和與第一個區間相連的區間都扔到一組裏面,剩下的留在另一組。
如果另一組爲空,則表示所有區間全部相連,那麼就輸出-1
多麼簡單的思路。。。爲什麼比賽的時候就想不出呢。。。
代碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
static const int maxn = 100010;
static const int INF = 0x3f3f3f3f;
static const int mod = (int)1e9 + 7;
static const double eps = 1e-6;
static const double pi = acos(-1);
void redirect(){
#ifdef LOCAL
freopen("test.txt","r",stdin);
#endif
}
struct node{
int id,l,r;
bool operator <(const node& y){
return this->l < y.l;
}
}p[200010];
int main(){
redirect();
int T,n;
scanf("%d",&T);
while(T--){
set<int>s;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
p[i].id = i;
scanf("%d %d",&p[i].l,&p[i].r);
}
sort(p+1,p+1+n);
s.insert(p[1].id);
int maxr = p[1].r;
bool flag = false;
for(int i = 1;i <= n;i++){
if(p[i].l > maxr){flag = true;break;}
s.insert(p[i].id);
maxr = max(maxr,p[i].r);
}
if(flag){
for(int i = 1;i <= n;i++){
if(s.count(i))printf("1");
else printf("2");
printf("%c",i==n?'\n':' ');
}
}
else puts("-1");
}
return 0;
}