一道cf水题

//题意,给你n个区间,要求你把这n个区间分成两个阵营,不同阵营之间的区间不能有重叠的部分,比如[1,3],[2,4],就重叠了。
//方法:一定能满足第二个阵营最左边区间的左端点>第一个阵营最右边区间的右端点。所以现在你就把第一个阵营最右边区间的右端点找出来。
//先用sort对所有区间的左端点从小到大排个序,直到你找到某个区间的左端点比上一个区间的右端点大,这个点就是两个阵营的分界点。
//注意,用另一个数组把左端点和右端点记录下来,然后在这个新数组里排序寻找分界点,这样原数组只用比较它的右端点和分界值的大小就可以了





#include<iostream> #include<cstdio> #include<algorithm> #define maxn 100005 using namespace std; int t; int n; int x; int l[maxn]; int r[maxn]; typedef struct seg { int l; int r; }node; node s[maxn]; int max(int a,int b) { return a>b?a:b; } bool cmp(node a,node b) { return a.l<b.l; } int main() { cin>>t; while(t--) { cin>>n; for(int i=1;i<=n;i++) { cin>>l[i]>>r[i]; s[i].l=l[i]; s[i].r=r[i]; } sort(s+1,s+n+1,cmp); x=s[1].r; int flag=0; for(int i=1;i<=n;i++) { if(s[i].l>x) { flag=1; break; } else x=max(x,s[i].r); }

if(!flag)
        cout<<"-1"<<"
";
        else
        {
        for(int i=1;i<=n;i++)
        if(r[i]<=x)
        cout<<"1"<<" ";
        else
        cout<<"2"<<" ";      
       }
    }
    
    return 0;
}
原文地址:https://www.cnblogs.com/rainyskywx/p/10289472.html