[CF429E]Points ans Segments_欧拉回路
Points and Segments
题目链接:www.codeforces.com/contest/429/problem/E
注释:略。
题解:
先离散化。
发现每个位置如果被偶数条线段覆盖的话那么这个位置上的线段两种颜色的个数是相等的也就是确定的。
如果是奇数的话,我们就强制再放一条线段覆盖这个位置,无论这条新加入线段的颜色,剩下的颜色个数也就确定了。
那么,每条线段只能有一种颜色,而且每个位置值为$0$。
我们想一个东西:欧拉回路。
发现欧拉回路其实要干的就是这事,所以我们暴力建图欧拉回路即可。
至于怎么想到欧拉回路这个东西.....看感觉吧......
代码:
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout) 
#define N 1000010 
using namespace std;
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
	int x = 0, f = 1;
	char c = nc();
	while (c < 48) {
		if (c == '-')
			f = -1;
		c = nc();
	}
	while (c > 47) {
		x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
	}
	return x * f;
}
int b[N];
struct Node {
	int x, y;
}a[N];
int head[N], to[N << 1], nxt[N << 1], tot = 1, id[N << 1], val[N << 1];
int ans[N];
inline void add(int x, int y, int z) {
	to[ ++ tot] = y;
	id[tot] = z;
	nxt[tot] = head[x];
	head[x] = tot;
}
bool vis[N];
int d[N];
void dfs(int p) {
	vis[p] = true;
	for (int i = head[p]; i; i = nxt[i]) {
		if (!val[i]) {
			val[i] = val[i ^ 1] = 1;
			if (p < to[i]) {
				ans[id[i]] = 1;
			}
			else {
				ans[id[i]] = 0;
			}
			dfs(to[i]);
		}
	}
}
int main() {
	setIO("party");
	int n = rd(), cnt = 0;
	for (int i = 1; i <= n; i ++ ) {
		a[i].x = rd(), a[i].y = rd() + 1;
		b[ ++ cnt] = a[i].x, b[ ++ cnt] = a[i].y;
	}
	sort(b + 1, b + cnt + 1);
	cnt = unique(b + 1, b + cnt + 1) - b - 1;
	// cout << cnt << endl ;
	for (int i = 1; i <= n; i ++ ) {
		a[i].x = lower_bound(b + 1, b + cnt + 1, a[i].x) - b;
		a[i].y = lower_bound(b + 1, b + cnt + 1, a[i].y) - b;
		add(a[i].x, a[i].y, i), add(a[i].y, a[i].x, i);
		d[a[i].x] ++ , d[a[i].y] ++ ;
	}
	// for (int i = 1; i <= n; i ++ ) {
	// 	printf("%d %d\n", a[i].x, a[i].y);
	// }
	int pre = 0;
	for (int i = 1; i <= cnt; i ++ ) {
		if (d[i] & 1) {
			if (!pre) {
				pre = i;
			}
			else {
				add(pre, i, 0), add(i, pre, 0);
				d[i] ++ , d[pre] ++ ;
				pre = 0;
			}
		}
	}
	for (int i = 1; i <= cnt; i ++ ) {
		if (!vis[i]) {
			dfs(i);
		}
	}
	for (int i = 1; i <= n; i ++ ) {
		printf("%d ", ans[i]);
	}
	fclose(stdin), fclose(stdout);
	return 0;
}
[CF429E]Points ans Segments_欧拉回路的更多相关文章
- CF429E Points and Segments
		链接 CF429E Points and Segments 给定\(n\)条线段,然后给这些线段红蓝染色,求最后直线上上任意一个点被蓝色及红色线段覆盖次数之差的绝对值不大于\(1\),构造方案,\(n ... 
- 【CF429E】Points and Segments 欧拉回路
		[CF429E]Points and Segments 题意:给你数轴上的n条线段$[l_i,r_i]$,你要给每条线段确定一个权值+1/-1,使得:对于数轴上的任一个点,所有包含它的线段的权值和只能 ... 
- CF429E Points and Segments 构造、欧拉回路
		传送门 如果把一条线段\([l,r]\)看成一条无向边\((l,r+1)\),从\(l\)走到\(r+1\)表示线段\([l,r]\)染成红色,从\(r+1\)走到\(l\)表示线段\([l,r]\) ... 
- nyoj 230/poj 2513 彩色棒 并查集+字典树+欧拉回路
		题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=230 题意:给你许许多多的木棍,没条木棍两端有两种颜色,问你在将木棍相连时,接触的端点颜色 ... 
- bzoj 2935 [Poi1999]原始生物——欧拉回路思路!
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2935 有向图用最小的路径(==总点数最少)覆盖所有边. 完了完了我居然连1999年的题都做不 ... 
- 452. Minimum Number of Arrows to Burst Balloons——排序+贪心算法
		There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ... 
- [Swift]LeetCode948. 令牌放置 | Bag of Tokens
		You have an initial power P, an initial score of 0 points, and a bag of tokens. Each token can be us ... 
- 【CF429E】Points and Segments(欧拉回路)
		[CF429E]Points and Segments(欧拉回路) 题面 CF 洛谷 题解 欧拉回路有这样一个性质,如果把所有点在平面内排成一行,路径看成区间的覆盖,那么每个点被从左往右的覆盖次数等于 ... 
- 【CF429E】 Points and Segments(欧拉回路)
		传送门 CodeForces 洛谷 Solution 考虑欧拉回路有一个性质. 如果把点抽出来搞成一条直线,路径看成区间覆盖,那么一个点从左往右被覆盖的次数等于从右往左被覆盖的次数. 发现这个性质和本 ... 
随机推荐
- 将.mat文件中的数据转换成图片
			%% 如何将.mat文件中的数据转换成图片 clc;clear all; addpath F_data/MAT;load('D:\face.mat') for i=1:q img=uint8(re ... 
- 网络1911、1912 C语言第4次作业--函数批改总结
			目录 网络1911.1912 C语言第4次作业--函数批改总结 一.评分规则 二.本次作业亮点 三.本次作业存在的问题 四.助教有话说 五.得分详情 网络1911.1912 C语言第4次作业--函数批 ... 
- 离线语音Snowboy热词唤醒+ 树莓派语音交互实现开关灯
			离线语音Snowboy热词唤醒 语音识别现在有非常广泛的应用场景,如手机的语音助手,智能音响(小爱,叮咚,天猫精灵...)等. 语音识别一般包含三个阶段:热词唤醒,语音录入,识别和逻辑控制阶段. 热词 ... 
- ZR#996
			ZR#996 解法: 若删除长度为 $ x $ 的子串后序列中没有相同元素,那么一定有至少一个长度为 $ x+1 $ 的子串,删除它后序列中也没有相同元素. CODE: #include <io ... 
- encode && decode && 加密 &&解密
			1.urlencode 当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的(除了 -_.) string urlencode ( string $str )返回字符串 ... 
- MapReduce shuffle的过程分析
			shuffle阶段其实就是多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点上. Map端: 1.在map端首先接触的是InputSplit,在InputSplit中含有D ... 
- Python 自学笔记(四)
			1.for...in...循环语句 1-1.遍历列表 1-2.遍历字典 1-2-1.遍历字典的键和值 1-2-2.遍历字典的键值(一) 1-2-3.遍历字典的键值(二) 1-2-4.遍历字典的值 1- ... 
- 如何永久激活(破解) IntelliJ IDEA 2018.2.2
			原 如何永久激活(破解) IntelliJ IDEA 2018.2.2 版权声明:本文为博主原创文章,转载不需要博主同意,只需贴上原文链接即可. https://blog.csdn.net/zhige ... 
- C之堆栈
			栈* 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 堆* 程序员自己申请* new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* java中自动回收,C中需 ... 
- 使用es6一句话去重
			let arr = [1,2,3,4,5,1,2,3] let arr2 = Array.from(new Set(arr)) console.log(arr2) //[1,2,3,4,5] 
