正解貌似是大暴搜?

首先我们考虑这是一个二分图,建立网络流模型后很容易得出一个算法

S->行 容量为Num[X]/2;

行->列 容量为1 且要求(x,y)这个点存在

列->T 容量为Num[Y]/2

这样子跑网络流之后我们就得到了一组解

但是我们考虑输出方案

对于每一行,如果Num[X]为偶数,那么显然输出方案是正确的

但是如果Num[x]为奇数,多出的那个显然既有可能是红的也可能是蓝的

但关键是我们不能确定他是红的或者蓝的,因为他的状态也会影响对应的列

同样,列的考虑也是同理

所以我们对于残量网络,如果Num[X]或者Num[Y]是奇数,那么就连对应的容量为1的边

对残量网络在进行一次网络流,这样就可以输出方案辣

(话说网络流跑40w的点居然一点也不虚)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define h(i) i
#define l(i) i+200000
using namespace std; const int maxn=200010;
const int oo=0x7fffffff;
int S,T;
int n,cntx,cnty;
int X[maxn],Y[maxn];
int NX[maxn],NY[maxn];
int idx[maxn],idy[maxn];
bool visx[maxn],visy[maxn];
int h[maxn<<1],cnt=1;
int cur[maxn<<1];
struct edge{
int to,next,w;
}G[4000010];
int vis[maxn<<1];
queue<int>Q; void add(int x,int y,int z){
++cnt;
G[cnt].to=y;G[cnt].next=h[x];G[cnt].w=z;h[x]=cnt;
++cnt;
G[cnt].to=x;G[cnt].next=h[y];G[cnt].w=0;h[y]=cnt;
}
void read(int &num){
num=0;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
}
bool BFS(){
memset(vis,-1,sizeof(vis));
Q.push(S);vis[S]=1;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(vis[v]==-1&&G[i].w>0){
vis[v]=vis[u]+1;
Q.push(v);
}
}
}return vis[T]!=-1;
}
int DFS(int x,int f){
if(x==T||f==0)return f;
int w,used=0;
for(int i=cur[x];i;i=G[i].next){
if(vis[G[i].to]==vis[x]+1){
w=f-used;
w=DFS(G[i].to,min(w,G[i].w));
G[i].w-=w;G[i^1].w+=w;
if(G[i].w>0)cur[x]=i;
used+=w;if(used==f)return used;
}
}
if(!used)vis[x]=-1;
return used;
}
void dinic(){
while(BFS()){
for(int i=S;i<=T;++i)cur[i]=h[i];
DFS(S,oo);
}return;
} int main(){
read(n);S=0;T=400001;
for(int i=1;i<=n;++i){
read(X[i]);read(Y[i]);
NX[X[i]]++;NY[Y[i]]++;
}
for(int i=1;i<=n;++i)add(h(X[i]),l(Y[i]),1);
for(int i=1;i<=n;++i){
if(!visx[X[i]]){
add(S,h(X[i]),NX[X[i]]>>1);
visx[X[i]]=true;
}
if(!visy[Y[i]]){
add(l(Y[i]),T,NY[Y[i]]>>1);
visy[Y[i]]=true;
}
}
dinic();
memset(visx,false,sizeof(visx));
memset(visy,false,sizeof(visy));
for(int i=1;i<=n;++i){
if(!visx[X[i]]){
visx[X[i]]=true;
if(NX[X[i]]&1)add(S,h(X[i]),1);
}
if(!visy[Y[i]]){
visy[Y[i]]=true;
if(NY[Y[i]]&1)add(l(Y[i]),T,1);
}
}
dinic();
for(int i=1;i<=n;++i){
if(!G[(i<<1)+1].w)printf("b");
else printf("r");
}return 0;
}

  

codeforces #305 D Mike and Fish的更多相关文章

  1. codeforces #305 A Mike and Frog

    挺简单的题目,但是有一堆恶心的边界 在刨去恶心的边界之后: 假定我们知道两边的循环节为b1,b2 其中h第一次到达目标的时间为a1,a2 又知道对于答案t t=a1+b1*t1=a2+b2*t2 不妨 ...

  2. codeforces #305 B Mike and Feet

    跟之前做过的51Nod的移数博弈是一样的QAQ 我们考虑每个数的贡献 定义其左边第一个比他小的数的位置为L 定义其右边第一个比他小的数的位置为R 这个可以用排序+链表 或者 单调队列 搞定 那么对于区 ...

  3. codeforces #305 C Mike and Foam

    首先我们注意到ai<=50w 因为2*3*5*7*11*13*17=510510 所以其最多含有6个质因子 我们将每个数的贡献分离, 添加就等于加上了跟这个数相关的互素对 删除就等于减去了跟这个 ...

  4. codeforces #305 E Mike and friends

    原问题可以转化为:给定第k个字符串,求它在L-R的字符串里作为子串出现了多少次 定义子串为字符串的某个前缀的某个后缀(废话) 等价于我们把一个字符串插入到trie里,其过程中每个经过的节点和其向上的f ...

  5. Codeforces 247D Mike and Fish

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

  6. CF 547 D. Mike and Fish

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

  7. Codeforces 547C/548E - Mike and Foam 题解

    目录 Codeforces 547C/548E - Mike and Foam 题解 前置芝士 - 容斥原理 题意 想法(口胡) 做法 程序 感谢 Codeforces 547C/548E - Mik ...

  8. 「CF547D」 Mike and Fish

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

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

随机推荐

  1. OC12_自动释放池

    // // Dog.h // OC12_自动释放池 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxuem ...

  2. ZigBee NV层使用

    原文转载于http://www.cnblogs.com/yqh2007/archive/2011/05/31/2065284.html 系统NV区:初始化nv数据项   osal_nv_item_in ...

  3. 基于TLS的反调试技术

    TLS(Thread Local Storage 线程局部存储) 一个进程中的每个线程在访问同一个线程局部存储时,访问到的都是独立的绑定于该线程的数据块.在PEB(进程环境块)中TLS存储槽共64个( ...

  4. MySQL和Navicat使用总结

    1.给字段设置默认字符值 ALTER TABLE `v_users`MODIFY COLUMN `picture` varchar(50) CHARACTER SET utf8 COLLATE utf ...

  5. Transact-SQL 存储过程(c#调用执行)

    1. Microsoft SQL Server Management Studio 中创建 存储过程 1.1 借助模板资源管理器中的Stored Procedure模板进行修改创建 1.2 直接新建查 ...

  6. margin的BUG(2)

    继续上一次的学习,这次又发现了margin的第二个bug.既当同时对两个相邻的div盒子设置margin时,他们之间的间隙不能正常显示. 具体表述为:先建立两个div1和div2 <div cl ...

  7. discuz random函数

    在研究邮箱非必填的过程中发现了个比较好用的random函数,在function_core.php中找到声明: function random($length, $numeric = 0) { $see ...

  8. php session学习笔记(实例代码)

    http  无状态协议 一个服务器向客户端发送消息的时候有三条信息 一是状态二是头信息三是内容 会话控制 让一个用户访问每个页面,服务器都知道是哪个用户访问 cookie cookie是通过头信息发送 ...

  9. YII千万级PV架构经验分享--理论篇

    hello,大家好,我是方少,现在想象一下这样一个情景,这是一个很惬意的季节,是一个可以随意乱穿的季节,两个人,一个穿羽绒服,一个穿热裤,小胡同里两人迎面走来,看到对方都哈哈大笑,前仰后合,笑完都甩一 ...

  10. 在asp.net mvc中如何使用Grid++ Report (锐浪报表)

    在asp.net mvc中如何使用Grid++ Report (锐浪报表) 在cshtml,razor中的处理方法 以官方的asp.net(csharp)中的第一个示例"1a.简单表格&qu ...