您当前的位置: 首页 >  nio

不牌不改

暂无认证

  • 2浏览

    0关注

    422博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CodeForces 1101C Division and Union

不牌不改 发布时间:2021-07-14 08:26:37 ,浏览量:2

题目大意

https://codeforces.com/problemset/problem/1101/C 多段区间,分成两组,若不能保证从两组中任取一个区间都不会相交,则输出-1;能保证则输出每段区间所在的组号(1、2)

题解

贪心+思维 按区间左端点从小到大排序; 第一段区间一定属于第一组; 每遍历一段区间,判断其左端点与第一组中全部区间的最大右端点的大小关系,若遍历到的区间的左端点大,则表示此段区间与任意一段属于第一组的区间都不相交,此区间放在第二组,也可以推断出其后面的均可以放在第二组保证不会与第一组的相交;若遍历到的区间的左端点小于第一组中全部区间的最大右端点,则说明此段区间不能放在第二组,放入第一组同时更新第一组的全部区间的最大右端点; 因此只要找到第一个满足“遍历到的区间的左端点大于第一组中全部区间的最大右端点”的区间即可,其之前的均为第一组,之后(含其)的均为第二组。

代码
#include
using namespace std;
const int N = 1e5+10;
struct node{
	int l, r, idx, group;
}a[N];

bool cmp(node u, node v) {
	return u.l == v.l?u.r >n;
		for(int i = 1;i >a[i].l>>a[i].r, a[i].idx = i;
		sort(a+1, a+n+1, cmp);
		int k = 0;
		int rr = a[1].r;
		a[1].group = 1;
		for(int j = 2;j = a[j].l) rr = max(rr, a[j].r), a[j].group = 1;
			else {
				k = j;
				break;
			}
		}
//		for(int i = 1;i             
关注
打赏
1662186765
查看更多评论
0.1331s