CF 547 D. Mike and Fish
D. Mike and Fish
http://codeforces.com/contest/547/problem/D
题意:
给定平面上n个点,将这些点染成红或者蓝色,要求每行、每列红色点与蓝色点数量的差的绝对值<=1。输出方案(保证有解)。
分析:
参考popoqqq的博客
将每行每列分别看做一个点,给定的每个点(x,y)拆成x->y的边,那么连边后的图是一个二分图。
这样我们可以将边染色,使得与每个点相连的两种颜色差<=1。
于是对于所有的欧拉回路,我们可以直接交替染色。
但是会有度数为奇数的点,这样的点一定有偶数个,我们对其两两配对连边,这样所有奇度数的点度数就都为偶数了。
对于每个连通块,选一个初始度数为奇数的点(若没有则任选度数为偶数的点),求一条欧拉回路(若是奇度数点则应先走与配对的奇度数点相连的边),将路径上的边交替染色即可。
正确性:
对于一条欧拉回路,除起点外每个点相连的红边与蓝边数是相同的。对于起点,欧拉回路的第一条边和最后一条边的颜色可能是相同的。
若起点初始度数为奇数,由于先走了与新连出的边,所以就算第一条和最后一条边的颜色相同也没关系。(同色的话由于有影响的点在同行同列,一定连通,所以整个连通块只会额外多出一条边颜色不同)。
若起点初始度数为偶数,则连通块是一个二分图,第一条和最后一条边的颜色一定不相同。
还有一种神奇的做法:AOQNRMGYXLMV,caoyi0905
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const int D = 2e5; struct Edge{
int to, nxt, id;
}e[N << ];
int head[N], deg[N], A[N], sk[N], En = , top;
bool ve[N << ], vd[N];
char ans[N]; void add_edge(int u,int v,int id) {
++En; e[En].to = v, e[En].id = id, e[En].nxt = head[u]; head[u] = En;
++En; e[En].to = u, e[En].id = id, e[En].nxt = head[v]; head[v] = En;
deg[u] ++, deg[v] ++;
} void dfs(int u) {
vd[u] = true;
for (int i=head[u]; i; i=e[i].nxt) {
if (!ve[i]) {
ve[i] = ve[i ^ ] = true; head[u] = i;
dfs(e[i].to);
sk[++top] = e[i].id; i = head[u];
}
}
} int main() {
int n = read(), cnt = ;
for (int i=; i<=n; ++i) {
int u = read(), v = read() + D;
add_edge(u, v, i);
}
for (int i=; i<=(D<<); ++i)
if (deg[i] & ) A[++cnt] = i;
for (int i=; i<=cnt; i+=)
add_edge(A[i], A[i + ], ); for (int i=; i<=cnt; ++i) {
if (!vd[A[i]]) {
dfs(A[i]);
while (top) ans[sk[top]] = top & ? 'b' : 'r', top --;
}
}
for (int i=; i<=(D<<); ++i) {
if (!vd[i]) {
dfs(i);
while (top) ans[sk[top]] = top & ? 'b' : 'r', top --;
}
}
ans[n + ] = '\0';
puts(ans + );
return ;
}
CF 547 D. Mike and Fish的更多相关文章
- Codeforces 247D Mike and Fish
Mike and Fish 我们可以把这个模型转换一下就变成有两类点,一类是X轴, 一类是Y轴, 每个点相当于对应的点之间建一条边, 如果这条边变红两点同时+1, 变蓝两点同时-1. 我们能发现这个图 ...
- 「CF547D」 Mike and Fish
「CF547D」 Mike and Fish 传送门 介绍三种做法. \(\texttt{Solution 1}\) 上下界网络流 我们将每一行.每一列看成一个点. 两种颜色的数量最多相差 \(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 ...
- CF547D Mike and Fish 建图
题意: 有点长→CF547DMike and Fish. 分析: 其实也没什么好分析的,我这也是看的题解. (不过,那篇题解好像文字的代码不太对劲) 这里直接说做法,正确性自证: 对输入的,将横.纵坐 ...
- codeforces #305 D Mike and Fish
正解貌似是大暴搜? 首先我们考虑这是一个二分图,建立网络流模型后很容易得出一个算法 S->行 容量为Num[X]/2; 行->列 容量为1 且要求(x,y)这个点存在 列->T 容量 ...
- Codeforces 547D Mike and Fish
Description 题面 题目大意:有一个的网格图,给出其中的 \(n\) 个点,要你给这些点染蓝色或红色,满足对于每一行每一列都有红蓝数量的绝对值之差不超过1 Solution 首先建立二分图, ...
- Codeforces.547D.Mike and Fish(思路 欧拉回路)
题目链接 \(Description\) 给定平面上n个点,将这些点染成红or蓝色,要求每行.每列红色点与蓝色点数量的差的绝对值<=1.输出方案(保证有解). \(Solution\) 参考这 ...
- CodeForces 547D Mike and Fish 思维
题意: 二维平面上给出\(n\)个点,然后对每个点进行染色:红色和蓝色,要求位于同一行或同一列的点中,红色点和蓝色点的个数相差不超过1 分析: 正解是求欧拉路径,在这篇博客中看到一个巧妙的思路: 对于 ...
- CF547D Mike and Fish
欧拉回路,巧妙的解法. 发现每一个点$(x, y)$实际上是把横坐标和$x$和纵坐标$y$连一条线,然后代进去跑欧拉回路,这样里一条边对应了一个点,我们只要按照欧拉回路间隔染色即可. 注意到原图可能并 ...
随机推荐
- Html5 移动应用软件开发框架 JqueryMobile SenchaTouch 介绍
一.JqueryMobile 介绍 jQuery Mobile 是 jQuery 在手机上和平板设备上的版本. jQuery Mobile 不仅会给主流移动平台带来 jQuery 核心库,而且会发布一 ...
- ApplicationEventMulticaster接口笔记
ApplicationEventMulticaster 这个接口可以管理很多个ApplicationListener对象.并将事件发布给这些监听器. ApplicationEventPublisher ...
- 1221. [HNOI2001]软件开发【费用流】
Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...
- gluoncv 下载预训练模型速度太慢
export MXNET_GLUON_REPO=https://apache-mxnet.s3.cn-north-1.amazonaws.com.cn https://discuss.gluon.ai ...
- Django的视图响应类型
Django的视图响应类型 一. 视图函数编写原则 视图函数接受HTTP请求并返回响应,可以放在任何地方,可以是任何功能:视图函数可以返回Web文本,页面.重定向.错误.图片等任何内容:视图函数通过H ...
- prority_queue自定义类型使用
struct Tower{ Tower(int h, int p){ height = h; pos = p; } bool operator < (Tower &t) { if (he ...
- 数据结构——平衡二叉树(AVLTree)
3.平衡二叉树 平衡二叉树,又称AVL树,它是一种特殊的二叉排序树. 3.1 平衡二叉树的四种自旋 这个左旋.右旋,在方向上和我观念里的是相反的. 查了之后才知道: 1.外侧插入:LL.RR,都是在最 ...
- Emacs 快速指南 - 原生中文手册
Emacs 快速指南 -折叠目录 1. 小结(SUMMARY) 2. 基本的光标控制(BASIC CURSOR CONTROL) 3. 如果 EMACS 失去响应(IF EMACS STOPS RES ...
- JDK(三)JDK1.8源码分析【排序】mergeSort
归并排序是JDK对象数组的排序算法之一,接下来开始分析JDK的归并排序算法. /** * 将指定范围的对象数组按自然顺序升序排序 * * Src is the source array that st ...
- haproxy原理理解
1.haproxy使用最需要注意的点: 1.1连接数: 前端maxconn默认值为2000,非常有必要将其增加几倍. 1.2超时时间 timeout connect 60s # haproxy和服务端 ...