[bzoj4823][Cqoi2017]老C的方块
来自FallDream的博客,未经允许,请勿转载,谢谢。





挺有意思的一道题....
看完题面比较明确是最小割,考虑怎么建图 想了比较久
突破口应该是题目中那张奇怪的图
观察这个奇怪的图和方块,很容易发现每个图案,其实都是每个分割线周围各一个1*2的块拼在一起的

假如中间有个分割线,那么就是这样,两边分别三选一
然后可以依此根据块的位置不同建出图,我大概画了一部分,大家可以参考

这张图中行从下到上,列从左到右
然后注意把点拆成入点和出点,中间连费用的边 最小割即可。
可以哈希来查点
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#define S 0
#define MN 100000
#define INF 2000000000
#define ll long long
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} map<ll,int> mp;
struct edge{int to,next,w;}e[];
int n,m,c,T,head[MN*+],C[MN*+],q[MN*+],top=,d[MN*+],cnt=,ans=;
struct Block{int x,y,w;}b[MN+];
inline void ins(int f,int t,int w)
{
if(!t) return;
e[++cnt]=(edge){t,head[f],w};head[f]=cnt;
e[++cnt]=(edge){f,head[t],};head[t]=cnt;
}
inline int num(int x,int y)
{
if(x>n||y>m||x<||y<) return ;
int res=mp[1LL*x*MN+y];
return res?res+c:;
} int dfs(int x,int f)
{
if(x==T) return f;
int used=;
for(int&i=C[x];i;i=e[i].next)
if(e[i].w&&d[e[i].to]==d[x]+)
{
int w=dfs(e[i].to,min(f-used,e[i].w));
used+=w;e[i].w-=w;e[i^].w+=w;
if(used==f) return f;
}
return d[x]=-,used;
} bool bfs()
{
memset(d,,sizeof(int)*(T+));int i,j;
for(d[q[top=i=]=S]=;i<=top;++i)
for(int j=C[q[i]]=head[q[i]];j;j=e[j].next)
if(e[j].w&&!d[e[j].to])
d[q[++top]=e[j].to]=d[q[i]]+;
return d[T];
} int main()
{
m=read();n=read();c=read();T=c*+;
for(int i=;i<=c;++i) b[i].y=read(),b[i].x=read(),b[i].w=read(),mp[1LL*b[i].x*MN+b[i].y]=i;
for(int i=;i<=c;++i)
{
ins(i+c,i,b[i].w);
if(b[i].x&)
{
int cas=b[i].y%;
if(cas==)
{
ins(S,i+c,INF);
ins(i,num(b[i].x+,b[i].y),INF);
ins(i,num(b[i].x-,b[i].y),INF);
ins(i,num(b[i].x,b[i].y+),INF);
}
if(cas==) ins(i,num(b[i].x,b[i].y+),INF);
if(cas==)
{
ins(i,num(b[i].x+,b[i].y),INF);
ins(i,num(b[i].x-,b[i].y),INF);
ins(i,num(b[i].x,b[i].y+),INF);
}
if(cas==) ins(i,T,INF);
}
else
{
int cas=b[i].y%;
if(cas==) ins(i,num(b[i].x,b[i].y-),INF);
if(cas==)
{
ins(S,i+c,INF);
ins(i,num(b[i].x,b[i].y-),INF);
ins(i,num(b[i].x+,b[i].y),INF);
ins(i,num(b[i].x-,b[i].y),INF);
}
if(cas==) ins(i,T,INF);
if(cas==)
{
ins(i,num(b[i].x,b[i].y-),INF);
ins(i,num(b[i].x-,b[i].y),INF);
ins(i,num(b[i].x+,b[i].y),INF);
}
}
}
while(bfs()) ans+=dfs(S,INF);
printf("%d\n",ans);
return ;
}
[bzoj4823][Cqoi2017]老C的方块的更多相关文章
- bzoj4823: [Cqoi2017]老C的方块(最小割)
4823: [Cqoi2017]老C的方块 题目:传送门 题解: 毒瘤题ORZ.... 太菜了看出来是最小割啥边都不会建...狂%大佬强强强 黑白染色?不!是四个色一起染,四层图跑最小割... 很 ...
- BZOJ4823 CQOI2017老C的方块(最小割)
如果将其转化为一个更一般的问题即二分图带权最小单边点覆盖(最小控制集)感觉是非常npc的.考虑原题给的一大堆东西究竟有什么奇怪的性质. 容易发现如果与特殊边相邻的两格子都放了方块,并且这两个格子都各有 ...
- BZOJ4823 [Cqoi2017]老C的方块 【最小割】
题目 老C是个程序员. 作为一个懒惰的程序员,老C经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上,如果两个小方格有公共的边,就称它们是相邻的,而且有些相邻的小方格之间的公 ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- 【BZOJ4823】[CQOI2017]老C的方块(网络流)
[BZOJ4823][CQOI2017]老C的方块(网络流) 题面 BZOJ 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...
- bzoj 4823: [Cqoi2017]老C的方块 [最小割]
4823: [Cqoi2017]老C的方块 题意: 鬼畜方块游戏不解释... 有些特殊边,有些四个方块组成的图形,方块有代价,删掉一些方块使得没有图形,最小化代价. 比较明显的最小割,一个图形中必须删 ...
- [bzoj4823][洛谷P3756][Cqoi2017]老C的方块
Description 老 C 是个程序员. 作为一个懒惰的程序员,老 C 经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上 ,如果两个小方格有公共的边,就称它们是相邻的, ...
- [CQOI2017]老C的方块 网络流
---题面--- 题解: 做这题做了好久,,,换了4种建图QAQ 首先我们观察弃疗的形状,可以发现有一个特点,那就是都以一个固定不变的特殊边为中心的,如果我们将特殊边两边的方块分别称为s块和t块, 那 ...
- 【题解】CQOI2017老C的方块
网络流真的是一种神奇的算法.在一张图上面求感觉高度自动化的方案一般而言好像都是网络流的主阵地.讲真一开始看到这道题也有点懵,题面很长,感觉很难的样子.不过,仔细阅读了题意之后明白了:我们所要做的就是要 ...
随机推荐
- STL常用整理
S T L Sting: << 判断拼音序 size length 字符串长度 str[n] 代表字符串中的一个字符 可用作左值 string::size_type 用于表示字符串长度计量 ...
- 如何进行服务器Linux系统下的ext文件系统修复
一.故障描述 服务器是dell 730系列服务器,存储阵列是MD3200系列存储5T的Lun,操作系统是Linux centos 7,文件系统类型是EXT4,因意外断电,导致系统不能正常启动,修复之后 ...
- UML开发工具Rose ralation的破解安装,
UML开发工具Rose ralation的在windows764破解安装, 安装下载还可以参考:http://www.cnblogs.com/leaven/p/3718361.html 跟大家分享怎么 ...
- 使用HTML5视频事件示例
<!DOCTYPE html > <html > <head> <title>Video events example</title> &l ...
- MySQL binlog 日志
一:MySQL 日志的三种类型: statement.row.mix 格式.推荐使用row格式. 怎么设置自己的日志格式呢? 1. set globle binlog_format='MIXED' 2 ...
- GIT入门笔记(17)- 创建分支dev_lsq, 提交到代码
git服务器上默认的已经有主干和test分支. 开发人员提交代码流程如下: 1.用switch to->new branch创建dev1分支 2.push branch提交到dev1分支 3.在 ...
- Spring Security 入门(1-7)Spring Security - Session管理
参考链接:https://xueliang.org/article/detail/20170302232815082 session 管理 Spring Security 通过 http 元素下的子元 ...
- Spring Security 入门(1-8)缓存EhCache
- Python之格式化输出,初始编码以及运算符
一.题型 1.使用while循环输入 1 2 3 4 5 6 8 9 10 count = 0 while count < 10: count += 1 #count = count + ...
- 其实你并不懂如何定义一个 PHP 函数
<?php function divide($dividend, $divisor){ return $dividend / $divisor; } echo divide(12, 4); ec ...