题目链接

\(Description\)

给定平面上n个点,将这些点染成红or蓝色,要求每行、每列红色点与蓝色点数量的差的绝对值<=1。输出方案(保证有解)。

\(Solution\)

参考这

将每个横坐标、纵坐标分别看做一个点,将每个点(x,y)拆成x(row)->y(column)的边

这样我们可以将边染色,使得与每个点相连的两种颜色差<=1

于是对于所有的欧拉回路,我们可以直接交替染色

但是会有度数为奇数的点,这样的点一定有偶数个,我们对其两两配对连边,这样所有奇度数的点度数就都为偶数了

对于每个连通块,选一个初始度数为奇数的点(若没有则任选度数为偶数的点),求一条欧拉回路(若是奇度数点则应先走与配对的奇度数点相连的边),将路径上的边交替染色即可

**正确性: **

对于一条欧拉回路,除起点外每个点相连的红边与蓝边数是相同的

对于起点,欧拉回路的第一条边和最后一条边的颜色可能是相同的

若起点初始度数为奇数,由于先走了与新连出的边,所以就算第一条和最后一条边的颜色相同也没关系

(同色的话由于有影响的点在同行同列,一定连通,所以整个连通块只会额外多出一条边颜色不同)

若起点初始度数为偶数,则连通块是一个二分图,第一条和最后一条边的颜色一定不相同

还是有些似懂非懂。。我也很无奈啊 先学习这套路吧

//139ms	28400KB
#include <cstdio>
#include <cctype>
#define gc() getchar()
const int N=4e5+5,MAX=2e5; int n,Enum,H[N],to[N<<1],nxt[N<<1],id[N<<1],dgr[N],top,sk[N],A[N];
char Ans[N];
bool vis[N<<1],v[N];//点和边的vis是不一样的啊! inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline void AddEdge(int u,int v,int i){
++dgr[v], to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, id[Enum]=i;
}
void DFS(int x)
{
v[x]=1;
for(int i=H[x]; i; i=nxt[i])
if(!vis[i])
{
vis[i]=vis[i^1]=1, H[x]=i;
DFS(to[i]);
sk[++top]=id[i], i=H[x];
}
} int main()
{
n=read(); Enum=1;
for(int x,y,i=1; i<=n; ++i)
x=read(),y=read()+MAX,AddEdge(x,y,i),AddEdge(y,x,i);
int cnt=0;
for(int i=1; i<=MAX<<1; ++i)
if(dgr[i]&1) A[++cnt]=i;
for(int i=1; i<=cnt; i+=2)
AddEdge(A[i],A[i+1],0),AddEdge(A[i+1],A[i],0);
for(int i=1; i<=cnt; ++i)
if(!v[A[i]])
{
DFS(A[i]);
bool f=0;
while(top)
Ans[sk[top--]]=f?'r':'b',f^=1;
}
for(int i=1; i<=MAX<<1; ++i)
if(!v[i])
{
DFS(i);
bool f=0;
while(top)
Ans[sk[top--]]=f?'r':'b',f^=1;
}
Ans[n+1]='\0';
printf("%s",Ans+1); return 0;
}

Codeforces.547D.Mike and Fish(思路 欧拉回路)的更多相关文章

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

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

  2. 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 ...

  3. Codeforces 547D Mike and Fish

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

  4. CodeForces 547D Mike and Fish 思维

    题意: 二维平面上给出\(n\)个点,然后对每个点进行染色:红色和蓝色,要求位于同一行或同一列的点中,红色点和蓝色点的个数相差不超过1 分析: 正解是求欧拉路径,在这篇博客中看到一个巧妙的思路: 对于 ...

  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. 「CF547D」 Mike and Fish

    「CF547D」 Mike and Fish 传送门 介绍三种做法. \(\texttt{Solution 1}\) 上下界网络流 我们将每一行.每一列看成一个点. 两种颜色的数量最多相差 \(1\) ...

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

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

随机推荐

  1. 【转】inotify+rsync实现实时同步

    [转]inotify+rsync实现实时同步 1.1 什么是实时同步:如何实现实时同步 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 发现目录中数据产生变化,就利用rsync服 ...

  2. Linux相关指令和操作

    环境:Ubuntu16.04 1.安装ipython notebook 安装这个软件,必须安装anaconda: 注意几点:1.添加环境变量在安装的时候会自动询问你是否添加: 2.bash命令中应该和 ...

  3. 【实践】Yalmip使用Knitro的一些总结

    Yalmip使用Knitro的一些总结 1.软件 Knitro 11.0.1 Win64(包含安装包和确定机器ID的软件):链接:https://pan.baidu.com/s/14IfxlAdo3m ...

  4. windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速

    原文地址:http://www.jianshu.com/p/c245d46d43f0 写在前面的话 2016年11月29日,Google Brain 工程师团队宣布在 TensorFlow 0.12 ...

  5. 通达OA2008从windows环境移植到linux部署手册

    通达OA2008从windows环境移植到linux中(centos5.5及以上版本) OA系统拓扑图: 环境搭建(安装lamp环境) 1.安装xampp集成lamp包xampp-linux-1.6. ...

  6. Nodejs 实现ESL内联FreeSWITCH设定说明

    一.背景说明: SIP Server IP (Centos):192.168.11.61  ,服务器IP(Windows):192.168.11.19 二.目的: 能够从192.168.11.19上通 ...

  7. Android 颜色透明度换算

    每次开发的时候,UI在设计图中标注的颜色都是类似于#FF0000(红色),这倒没什么,但是呢后面却标注了30%的透明度,这下抓狂了,透明度怎么计算?不用着急,不用你算,收藏我这篇文章即可. 颜色简介 ...

  8. lr使用linux Generator测试https莫名报 SSL protocol error when attempting to connect with host

    接收一个性能测试任务,各种原因需要使用linux agent产生压力.诡异的事发生了,同样脚本windows回放成功,使用linux agent报如下错误,脚本回放失败. Action.c(33): ...

  9. java 对象锁学习

    机制 锁机制是用来解决多线程共享资源时产生的冲突问题的.java 为每一个对象关联一个对象锁,通常把锁分为对象锁和类锁,他们的本质都是对象锁,只不过对象锁关联的是类的 Object 对象 (java. ...

  10. 20155309南皓芯 网络对抗《网络攻防》 Exp1 PC平台逆向破解(5)M

    实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可 ...