[CF div2 Educational Round 58]C.Division and Union

題目鏈接:

C. Division and Union

題意描述:

給出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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章