CodeForces 547D Mike and Fish 思维
题意:
二维平面上给出\(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 思维的更多相关文章
- 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 ...
- Codeforces 547D - Mike and Fish(欧拉回路)
Codeforces 题目传送门 & 洛谷题目传送门 首先考虑将题目中的条件转化为图论的语言.看到"行""列",我们很自然地想到二分图中行.列转点,点转 ...
- Codeforces 547D Mike and Fish
Description 题面 题目大意:有一个的网格图,给出其中的 \(n\) 个点,要你给这些点染蓝色或红色,满足对于每一行每一列都有红蓝数量的绝对值之差不超过1 Solution 首先建立二分图, ...
- Codeforces.547D.Mike and Fish(思路 欧拉回路)
题目链接 \(Description\) 给定平面上n个点,将这些点染成红or蓝色,要求每行.每列红色点与蓝色点数量的差的绝对值<=1.输出方案(保证有解). \(Solution\) 参考这 ...
- Codeforces 247D Mike and Fish
Mike and Fish 我们可以把这个模型转换一下就变成有两类点,一类是X轴, 一类是Y轴, 每个点相当于对应的点之间建一条边, 如果这条边变红两点同时+1, 变蓝两点同时-1. 我们能发现这个图 ...
- 547D Mike and Fish
传送门 分析 见正睿10.3笔记 代码 #include<iostream> #include<cstdio> #include<cstring> #include ...
- CF 547 D. Mike and Fish
D. Mike and Fish http://codeforces.com/contest/547/problem/D 题意: 给定平面上n个点,将这些点染成红或者蓝色,要求每行.每列红色点与蓝色点 ...
- hdu4135-Co-prime & Codeforces 547C Mike and Foam (容斥原理)
hdu4135 求[L,R]范围内与N互质的数的个数. 分别求[1,L]和[1,R]和n互质的个数,求差. 利用容斥原理求解. 二进制枚举每一种质数的组合,奇加偶减. #include <bit ...
- codeforces 547E Mike and Friends
codeforces 547E Mike and Friends 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define ...
随机推荐
- Android(java)学习笔记207:Android下的属性动画(Property Animation)
1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...
- android开发者您还在为模拟器犯愁吗?神级android模拟器---Genymotion一个更快、接近完美的模拟器……
摘要:Android系统非常特别,App须要进行模拟化測试.即使这样仍然有解决的办法---虚拟化技术. 之前的模拟器比方eclipse自带的是非常慢的一种,并且模拟器的版本号并非最新的.开机.能够说差 ...
- PHP------知识复习
PHP概述 (1)PHP(Hypertext Perprocessor)超级文本预处理器 (2) PHP是一种在服务器端执行的嵌入HTML文档的脚本语言 (3) 是一种网站开发语言(B/S结构) ( ...
- PHP使用in_array函数检查数组中是否存在某个值
PHP使用 in_array() 函数检查数组中是否存在某个值,如果存在则返回 TRUE ,否则返回 FALSE. bool in_array( mixed needle, array array [ ...
- 2019.1.1 在重写的方法上面添加@Override注解方法报错解决办法
报错代码 The method transfer(Integer, Integer, Double) of type AccountServiceImpl must override a superc ...
- ESlint 语法检测配置说明
部分vue-cli脚手架创建的默认eslint规则: 代码末尾不能加分号 ; 代码中不能存在多行空行 tab键不能使用,必须换成两个空格 代码中不能存在声明了但未使用的变量 关闭eslint 这里只说 ...
- es6之函数扩展与对象扩展
一.函数扩展 1.参数默认值 参数有默认值,后面不可以再加没有默认值的变量.如以下test函数中,不可以加写成 function test(x,y="word",z){ } fun ...
- Java中线程同步的理解
我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源, ...
- python入门基础:文件的读写
文件的读写操作运用广泛,无论是何种语言都会涉及到文件的输入输出. 下面简单的总结一下文件的读写: 1:open()函数 f = open('workfile', 'w') 函数 open()返回文件的 ...
- LwIP协议栈开发嵌入式网络的三种方法分析
LwIP协议栈开发嵌入式网络的三种方法分析 摘要 轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中.本文结合μC/OS-II这一实时操作系统,以 ...