CF1198E Rectangle Painting 2(最小割 思维
这个题主要是转化为最小割的思路不好想到。
大意:给你一个大的正方形,有的点黑,有的点白,要把黑染白,你每次可以选一个矩形染色,代价是min(长,宽),问最小代价。
思路:对于一个要染色的块来说,他要被行覆盖或列覆盖(选小的),就是min(占行数,占列数)。然后可以这样建网络流:源点->行结点(容量是占行数)->无穷大的边->列结点(容量是占列数)->汇点,然后跑最小割(最大流)。
#include<bits/stdc++.h>
#define M 405
using namespace std;
const int inf=1e9;
int n,m,s,t,h[M],tt=1;
struct node{int x1,y1,x2,y2;}A[M];
bool eg[M][M];
int B1[M*M],b1,B2[M*M],b2;
struct edge{int nxt,to,co;}G[M*M];
void Add(int a,int b,int c){
if(eg[a][b])return;
G[++tt]=(edge){h[a],b,c};
h[a]=tt;
eg[a][b]=1;
}
int dep[M],cur[M];
queue<int>Q;
bool bfs(){
memset(dep,-1,sizeof(dep));
for(int i=s;i<=t;i++)cur[i]=h[i];
while(!Q.empty())Q.pop();
Q.push(s);dep[s]=0;
while(!Q.empty()){
int x=Q.front();Q.pop();
for(int i=h[x];i;i=G[i].nxt){
int u=G[i].to,c=G[i].co;
if(dep[u]!=-1||!c)continue;
dep[u]=dep[x]+1;
if(u==t)return 1;
Q.push(u);
}
}
return 0;
}
int dfs(int x,int mi){
if(x==t||!mi)return mi;
int rlow=0,used=0;
for(int& i=cur[x];i;i=G[i].nxt){
int u=G[i].to,c=G[i].co;
if(dep[u]!=dep[x]+1||!c)continue;
if(rlow=dfs(u,min(c,mi-used))){
used+=rlow;
G[i].co-=rlow;
G[i^1].co+=rlow;
if(used==mi)break;
}
}
return used;
}
int ans=0;
void Dinic(){
while(bfs())ans+=dfs(s,inf);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&A[i].x1,&A[i].y1,&A[i].x2,&A[i].y2);
B1[++b1]=A[i].x1;B1[++b1]=++A[i].x2;
B2[++b2]=A[i].y1;B2[++b2]=++A[i].y2;
}
B1[++b1]=B2[++b2]=n+1;
sort(B1+1,B1+b1+1);sort(B2+1,B2+b2+1);
b1=unique(B1+1,B1+b1+1)-B1-1;
b2=unique(B2+1,B2+b2+1)-B2-1;
s=0,t=b1+b2+1;
for(int i=1;i<=m;i++){
A[i].x1=lower_bound(B1+1,B1+b1+1,A[i].x1)-B1;
A[i].x2=lower_bound(B1+1,B1+b1+1,A[i].x2)-B1;
A[i].y1=lower_bound(B2+1,B2+b2+1,A[i].y1)-B2;
A[i].y2=lower_bound(B2+1,B2+b2+1,A[i].y2)-B2;
for(int x=A[i].x1;x<A[i].x2;x++)
for(int y=A[i].y1;y<A[i].y2;y++)
Add(x,y+b1,inf),Add(y+b1,x,0);
}
for(int i=1;i<b1;i++){Add(s,i,B1[i+1]-B1[i]);Add(i,s,0);} //行结点编号是第几行,列结点编号是第几列+总行数。
for(int i=1;i<b2;i++){Add(i+b1,t,B2[i+1]-B2[i]);Add(t,i+b1,0);}
Dinic();printf("%d\n",ans);
return 0;
}
CF1198E Rectangle Painting 2(最小割 思维的更多相关文章
- Codeforces 1198E Rectangle Painting 2 最小点覆盖(网络流)
题意:有一个n * n的棋盘,每个棋盘有某些矩形区域被染成了黑色(这些矩形区域有可能相交),问把所有黑色区域染成白色的最小花费是多少?你每次可以选择把一个矩形区域染成白色,花费是染色的矩形区域长和宽的 ...
- codeforces 1198E Rectangle Painting 2 最小点覆盖
题目传送门 题意: 有一个$n∗n$的网格,网格中有一些矩形是黑的,其他点都是白的. 你每次可以花费$ min (h,w)$的代价把一个$h*w$的矩形区域变白.求把所有黑格变白的最小代价. 思路: ...
- 洛谷3973 TJOI2015线性代数(最小割+思维)
感觉要做出来这个题,需要一定的线代芝士 首先,我们来观察这个柿子. 我们将\(B\)的权值看作是收益的话,\(C\)的权值就是花费. 根据矩阵乘法的原理,只有当\(a[i]和a[j]\)都为\(1\) ...
- BZOJ 1324 Exca 神剑 最小割
标题效果:鉴于加权值矩阵,带走一个地方的权利值之后,与其相邻的格儿童权利值变0.问多少可以取出到右值. 思维:Amber论文题目.不难建设,图着色.颜色从S连边,还有一种颜色向T连边.再把相邻的格子连 ...
- [ZJOI2011]最小割
题解: 以前看过,思维挺神奇的一道题目 首先可以证明最小割是不能相交的 那么我们就可以找到任意两点求一次最小割然后将割的两边分开来再递归这个过程 另外最小割就是vis=0与vis=1之间的连边 分治的 ...
- 【BZOJ3630】[JLOI2014]镜面通道 几何+最小割
[BZOJ3630][JLOI2014]镜面通道 Description 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表 ...
- 「SHOI2007」「Codevs2341」 善意的投票(最小割
2341 善意的投票 2007年省队选拔赛上海市队选拔赛 时间限制: 5 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 幼儿园里有n个小朋 ...
- BZOJ 2039:[2009国家集训队]employ人员雇佣(最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=2039 题意:中文题意. 思路:一开始想着和之前做的最大权闭合图有点像,但是如果把边全部当成点的话,那 ...
- UVALive 7264 Kejin Game 网络流+最小割
Kejin Game 题意:一个人有一颗技能树, 现在它想修练到某个技能 (假设为x), 现在修一个技能有3种方式: 1, 将该技能的前置技能都学完了,才能学该技能. 2, 取消一个技能 与 另一个技 ...
随机推荐
- 关于java飞机躲炮弹的一些对象说明(带源码)
1.飞机躲炮弹的各种实体类都需要一个画笔将他们画出来 (GameObject) import java.awt.*; public void drawSelf(Graphics g){ g.drawI ...
- macvtap使用教程
kubernetes一键安装 macvtap是虚拟机网络虚拟化常用的一种技术,当然容器也可以用. MACVTAP 的实现基于传统的 MACVLAN. 和 TAP 设备一样,每一个 MACVTAP 设备 ...
- 【Intellij IDEA】设置 jdk 版本
File -> Project Structure... -> Project,如图所示:
- android 基于wifi模块通信开发
这篇文章主要是我写完手机与wifi模块通信后所用来总结编写过程的文章,下面,我分几点来说一下编写的大概流程. 一.拉出按钮控件并设置它的点击事件 二.设置wifi权限 三.打开和关闭wifi 四.扫描 ...
- 在Docker中部署Spring Boot项目
想要获取更多文章可以访问我的博客 - 代码无止境. 微服务现在在互联网公司可谓非常流行了,之前找工作的的时候很多HR电话约面试的时候都会问对微服务是否有过接触.而微服务和Docker可以非常完美的结合 ...
- 你了解HTTPS,但你可能不了解X.509
世上根本就没有HTTPS协议,只有HTTP协议.——知乎某答友 某天,收到领导指示:学习一下X.509相关原理. 很多开发者可能和我一样觉得X.509这个词很陌生,但其实我们经常和它打交道,属于典型的 ...
- Linux(Ubuntu)安装Swift和Swiftlint
很多时候iOS开发完毕需要接入CI中,而很多CI是基于Linux的,需要在Linux平台安装Swift和Swiftlint,下面就是针对这两个软件的安装步骤. Swift安装 环境 系统:Ubuntu ...
- Go orm框架gorm学习
之前咱们学习过原生的Go连接MYSQL的方法,使用Go自带的"database/sql"数据库连接api,"github.com/go-sql-driver/mysql& ...
- 转载 | Sublime text3 实用快捷键整理
实用快捷键 Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+ ...
- 对于微信UnionID在公众平台以及小程序里面的获取
首先介绍下UnionID的作用,在注册了微信开放平台(注意,这里是开放平台,不是微信公众平台)之后,同一个微信号在这个开放平台下的项目上面的UnionID都是统一的,通俗的说就是,小程序跟公众号项目在 ...