题意:

二维平面上给出\(n\)个点,然后对每个点进行染色:红色和蓝色,要求位于同一行或同一列的点中,红色点和蓝色点的个数相差不超过1

分析:

正解是求欧拉路径,在这篇博客中看到一个巧妙的思路:

对于同一行中的点,进行两两分组,每组的两个点之间连一条边(可能会剩下孤立点)。

同样地,同一列中的点,也进行两两分组,每组的两个点之间也连一条边。

将每条边的端点染上不同的颜色就满足了题目中的要求了。

为什么可以将得到的图进行二分染色呢?

这样的连接方式,保证了每个点左右两边最多有一边的点与其相连,上下两边最多有一边的点与其相连。

也就是每个点的度数最大为\(2\),这样这张图就是由若干条和链首尾闭合变成的简单组成的。

我们知道奇数长度的环是不能二分染色的

这些环还有个特点就是,相邻的两条边是互相垂直的,所以要想闭合的话,其边数一定为偶数。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
#define PB push_back
#define PII pair<int, int>
#define REP(i, a, b) for(int i = a; i < b; i++)
#define PER(i, a, b) for(int i = b - 1; i >= a; i--)
#define ALL(x) x.begin(), x.end() const int maxn = 200000 + 10; vector<int> row[maxn], col[maxn], G[maxn]; char ans[maxn]; struct Point {
int x, y, id;
void read() { scanf("%d%d", &x, &y); }
bool operator < (const Point& t) const {
return x < t.x || (x == t.x && y < t.y);
}
}; bool cmp(const Point& A, const Point& B) {
return A.y < B.y || (A.y == B.y && A.x < B.x);
} Point p[maxn]; void dfs(int u, int p = -1, int c = 0) {
ans[u] = c ? 'r' : 'b';
for(int v : G[u]) if(v != p && !ans[v])
dfs(v, u, c ^ 1);
} int main() {
int n; scanf("%d", &n);
REP(i, 0, n) {
p[i].read();
p[i].id = i;
}
sort(p, p + n);
for(int i = 0, j; i < n; i = j) {
for(j = i; j < n && p[j].x == p[i].x; j++);
for(int k = i + 1; k < j; k += 2) {
G[p[k].id].PB(p[k-1].id);
G[p[k-1].id].PB(p[k].id);
}
}
sort(p, p + n, cmp);
for(int i = 0, j; i < n; i = j) {
for(j = i; j < n && p[j].y == p[i].y; j++);
for(int k = i + 1; k < j; k += 2) {
G[p[k].id].PB(p[k-1].id);
G[p[k-1].id].PB(p[k].id);
}
} REP(i, 0, n) if(!ans[i]) dfs(i);
ans[n] = 0;
printf("%s\n", ans); return 0;
}

CodeForces 547D Mike and Fish 思维的更多相关文章

  1. CodeForces - 547D: Mike and Fish (转化为欧拉回路)(优化dfs稠密图)(定向问题)

    As everyone knows, bears love fish. But Mike is a strange bear; He hates fish! The even more strange ...

  2. Codeforces 547D - Mike and Fish(欧拉回路)

    Codeforces 题目传送门 & 洛谷题目传送门 首先考虑将题目中的条件转化为图论的语言.看到"行""列",我们很自然地想到二分图中行.列转点,点转 ...

  3. Codeforces 547D Mike and Fish

    Description 题面 题目大意:有一个的网格图,给出其中的 \(n\) 个点,要你给这些点染蓝色或红色,满足对于每一行每一列都有红蓝数量的绝对值之差不超过1 Solution 首先建立二分图, ...

  4. Codeforces.547D.Mike and Fish(思路 欧拉回路)

    题目链接 \(Description\) 给定平面上n个点,将这些点染成红or蓝色,要求每行.每列红色点与蓝色点数量的差的绝对值<=1.输出方案(保证有解). \(Solution\) 参考这 ...

  5. Codeforces 247D Mike and Fish

    Mike and Fish 我们可以把这个模型转换一下就变成有两类点,一类是X轴, 一类是Y轴, 每个点相当于对应的点之间建一条边, 如果这条边变红两点同时+1, 变蓝两点同时-1. 我们能发现这个图 ...

  6. 547D Mike and Fish

    传送门 分析 见正睿10.3笔记 代码 #include<iostream> #include<cstdio> #include<cstring> #include ...

  7. CF 547 D. Mike and Fish

    D. Mike and Fish http://codeforces.com/contest/547/problem/D 题意: 给定平面上n个点,将这些点染成红或者蓝色,要求每行.每列红色点与蓝色点 ...

  8. hdu4135-Co-prime & Codeforces 547C Mike and Foam (容斥原理)

    hdu4135 求[L,R]范围内与N互质的数的个数. 分别求[1,L]和[1,R]和n互质的个数,求差. 利用容斥原理求解. 二进制枚举每一种质数的组合,奇加偶减. #include <bit ...

  9. codeforces 547E Mike and Friends

    codeforces 547E Mike and Friends 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define ...

随机推荐

  1. 关于Jsp页面的jstl标签的级联属性的异常。

    使用SpringMVC框架时,当我做表单回显时. 情景描述.Employee 类有一个Department类的属性.这两个类存在多对一关联关系. 下面是Employee类的属性的定义. public ...

  2. Architecture pattern & Architecture style

    Architecture pattern: context + problem -> solution Architecture style: solution part of architec ...

  3. 小技巧:快速清除项目中的svn相关文件!

    习惯使用svn作为源代码管理工具,安全可靠 但是这些.svn字样的文件夹及文件也会随着源代码一同被deploy到Tomcat中,除了看着碍眼,也会占用Tomcat的性能 每次都是在项目部署目录里,搜索 ...

  4. webpack究竟是什么

    在很久很久以前,当我们写一个web网页的时候,js实现的逻辑相对是比较弱的.但随着前端技术的发展,前端能实现的内容越来越多.在js里面加了非常非常多的逻辑,于是呢,我们就发现我们通过这种面向过程的方式 ...

  5. Selenium基础知识(元素定位的调试)

    对一个不能直接定位的元素来说,调试是很常见的事,所以这里也简单总结了一下. 调试定位元素的工具很多,介绍也多,就不一一介绍了.下次有时间再补充.以下是我常用调试的方法(浏览器自带的控制台调试,仅介绍一 ...

  6. ajax简单做html查询删除(鲜花)

    下载视频+项目链接:https://pan.baidu.com/s/1jUld3-Nqm3fUAzFSX8kjlQ

  7. AOP切点切面内容

    一.实现接口MethodBeforeAdvice该拦截器会在调用方法前执行             实现接口   AfterReturningAdvice该拦截器会在调用方法后执行          ...

  8. Linux -- 用户篇

    Linux -- 用户与用户组 1.Linux 系统中有三种角色:所有者(用户),用户组与其他人,一张图可以说明用户与用户组的关系. 如图,某公司相当于一个用户组,该用户组下有A,B两个用户,用户拥有 ...

  9. delect 删除

    delete ---整表数据删除 (慎用) delete  * from 表名; ---条件删除 delete  * from  表名  where  限制条件;

  10. tomcat端口被占用如何解决

    有时候我们在eclipse中启动项目时,Tomcat服务器会报错,显示8080.8009.8005这几个端口被占用,此时你用debug启动项目时会发现不管用,console控制台什么信息也没有,此时产 ...