Codeforces 547D Mike and Fish
Description
题面
题目大意:有一个的网格图,给出其中的 \(n\) 个点,要你给这些点染蓝色或红色,满足对于每一行每一列都有红蓝数量的绝对值之差不超过1
Solution
首先建立二分图,点\((x,y)\)视作 \(x->y'\) 的一条边
问题转化为:给边染色,使得每一个点的两种颜色的数量之差不超过\(1\)
如果原图存在欧拉回路,那么沿着欧拉回路交替染色即可(因为一定是偶环)
但是实际上存在度数为奇数的点,不能够成欧拉回路,所以我们先把它变成欧拉回路
容易发现度数为奇数的点的数量是偶数,那么我们新加一些边,使得奇数点两两匹配连边,那么度数就变成了偶数
然后我们发现这样原图就不一定是二分图了,有可能存在奇环(只有起始点会矛盾)
我们先把度数为奇数的点遍历掉,如果没有被遍历到的就都是偶环了,黑白染色肯定符合要求,我们可以直接丢掉
实际上我们只需要从新加入的边开始找欧拉回路就行了,因为这条边实际上是废边
如何证明正确性?
因为矛盾的情况一定是起始点存在某种颜色多了\(1\),而废边正好把这个多了的给消除了,所以是合法的
注意:找欧拉回路时,走过的边就可以不走了,那么就可以从邻接表上直接删除,不然复杂度会出问题
#include<bits/stdc++.h>
using namespace std;
const int N=400400,M=2e5;
int n,head[N],nxt[N<<1],to[N<<1],num=1,in[N],q[N],top=0,tot;
bool vis[N],ans[N],v[N<<1];int id[N<<1];
inline void link(int x,int y,int ID)
{nxt[++num]=head[x];to[num]=y;head[x]=num;id[num]=ID;}
inline void dfs(int x){
vis[x]=1;
int i;
while(head[x]){
i=head[x];
head[x]=nxt[i];
if(v[i])continue;
v[i^1]=1,dfs(to[i]);
q[++top]=id[i];
}
}
int main(){
int x,y;
scanf("%d",&n);tot=M<<1;
for(int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
link(x,y+M,i);link(y+M,x,i);
in[x]++;in[y+M]++;
}
static int lis[N],cnt=0;
for(int i=1;i<=tot;i++)if(in[i]&1)lis[++cnt]=i;
for(int i=1;i<=cnt;i+=2)link(lis[i],lis[i+1],0),link(lis[i+1],lis[i],0);
bool c=0;
for(int i=1;i<=cnt;i++){
if(!vis[lis[i]]){
dfs(lis[i]);c=0;
while(top){
c^=1;
if(q[top])ans[q[top]]=c;
q[top--]=0;
}
}
}
for(int i=1;i<=tot;i++){
if(!vis[i]){
dfs(i);c=0;
while(top){
c^=1;
if(q[top])ans[q[top]]=c;
q[top--]=0;
}
}
}
for(int i=1;i<=n;i++)printf("%c",ans[i]?'r':'b');
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个点,将这些点染成红or蓝色,要求每行.每列红色点与蓝色点数量的差的绝对值<=1.输出方案(保证有解). \(Solution\) 参考这 ...
- CodeForces 547D Mike and Fish 思维
题意: 二维平面上给出\(n\)个点,然后对每个点进行染色:红色和蓝色,要求位于同一行或同一列的点中,红色点和蓝色点的个数相差不超过1 分析: 正解是求欧拉路径,在这篇博客中看到一个巧妙的思路: 对于 ...
- 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 ...
随机推荐
- C语言第五次作业函数
一.PTA实验作业 题目1: 6-6 使用函数输出水仙花数 1.本题PTA提交列表 2.设计思路 1.narcissistic函数 1.由于number的值后面会变化,所以定义d,e用于储存numbe ...
- 咸鱼翻身beta冲刺博客集
咸鱼翻身beta冲刺博客集 凡事预则立-于Beta冲刺前 beta冲刺1-咸鱼 beta冲刺2-咸鱼 beta冲刺3-咸鱼 beta冲刺4-咸鱼 beta冲刺5-咸鱼 beta冲刺6-咸鱼 beta冲 ...
- 20145237 《Java程序设计》第三周学习总结
20145237 <Java程序设计>第3周学习总结 教材学习内容总结 第四章主要讲了Java基本类型中的类类型,如何定义类.构造函数.使用标准类.基本类型打包器.数组复制.字符串等内容查 ...
- 静态关键字static用法。
static的特点:1,static是一个修饰符,用于修饰成员.2,static修饰的成员被所有的对象所共享.3,static优先于对象存在,因为static的成员随着类的加载就已经存在了. 4,st ...
- js日常积累
1.数组转字符串 str.join(',') 2.字符串转数组 arr.split(',') 3.数组排序 function sorb(a,b){return a-b;}; arr.sort(sorb ...
- 洛谷 P3797 妖梦斩木棒
https://www.luogu.org/problem/show?pid=3797 题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了 ...
- 为SRS流媒体服务器添加HLS加密功能(附源码)
为SRS流媒体服务器添加HLS加密功能(附源码) 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的叫做 ...
- Linux环境下发布.net core
一.安装Linux环境 1. 安装VM虚拟机和操作系统 VM虚拟工具安装的过程详见:http://blog.csdn.net/stpeace/article/details/78598333.直接按照 ...
- 移动端H5活动页优化方案
背景 项目:移动端H5电商项目 痛点:慢!!! 初始方案:最基本的图片懒加载,静态资源放到cdn,predns等等已经都做了.但是还是慢,慢在哪? 显而易见的原因:由于前后端分离,所有的数据都由接口下 ...
- ASP.NET Web API编程——路由
路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Register方法中定义路由,例如模板默认生 ...