[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的方块
网络流真的是一种神奇的算法.在一张图上面求感觉高度自动化的方案一般而言好像都是网络流的主阵地.讲真一开始看到这道题也有点懵,题面很长,感觉很难的样子.不过,仔细阅读了题意之后明白了:我们所要做的就是要 ...
随机推荐
- 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)
标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...
- vue 中获取select 的option的value 直接click?
我刚开始遇到这个问题的时候 直接用的click进行dom操作获取value 但是发现并灭有什么作用 问了旁边大神 才想起来还有change这个操作 于是乎 答案有了解决方案 1.在你的select中添 ...
- Linux的打印rpm包的详细信息的shell脚本
#!/bin/bash # list a content summary of a number of RPM packages # USAGE: showrpm rpmfile1 rpmfile2 ...
- VMware vCenter Server 6.5.0 U1
VMware vCenter Server 6.5.0 U1gName: VMware-VCSA-all-6.5.0-8024368.iso Release Date: 2018-03-20 Buil ...
- spring MVC框架入门(外加SSM整合)
spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...
- spring3——IOC之基于XML的依赖注入(DI )
我们知道spring容器的作用是负责对象的创建和对象间关系的维护,在上一篇博客中我们讲到spring容器会先调用对象的无参构造方法创建一个空值对象,那么接下来容器就会对对象的属性进行初始化,这个初始化 ...
- Object.defineProperties()和Object.defineProperty()方法
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法:Object.defineProperty(obj, pro ...
- RxJava系列2(基本概念及使用介绍)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- CentOS7从U盘中拷贝文件
1. 要想从U盘中拷贝文件,必须要将U盘挂载到一个目录中,所以必须新建一个目录,一般建在/mnt下.我们执行:mkdir /mnt/usb来新建一个目录. 2. 查看U盘是否已经被识别.执行:df - ...
- 记录项目中用的laypage分页代码
最终才觉得,好记性不如烂笔头,毕竟已经不是刚毕业时候的巅峰了,精力有所下降,很多时候记不住东西. 参考url:http://www.layui.com/laypage/ 直接上代码了 <scri ...