[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;
}

猜你喜欢

转载自blog.csdn.net/krypton12138/article/details/86416264
今日推荐