这个题主要是转化为最小割的思路不好想到。

大意:给你一个大的正方形,有的点黑,有的点白,要把黑染白,你每次可以选一个矩形染色,代价是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(最小割 思维的更多相关文章

  1. Codeforces 1198E Rectangle Painting 2 最小点覆盖(网络流)

    题意:有一个n * n的棋盘,每个棋盘有某些矩形区域被染成了黑色(这些矩形区域有可能相交),问把所有黑色区域染成白色的最小花费是多少?你每次可以选择把一个矩形区域染成白色,花费是染色的矩形区域长和宽的 ...

  2. codeforces 1198E Rectangle Painting 2 最小点覆盖

    题目传送门 题意: 有一个$n∗n$的网格,网格中有一些矩形是黑的,其他点都是白的. 你每次可以花费$ min (h,w)$的代价把一个$h*w$的矩形区域变白.求把所有黑格变白的最小代价. 思路: ...

  3. 洛谷3973 TJOI2015线性代数(最小割+思维)

    感觉要做出来这个题,需要一定的线代芝士 首先,我们来观察这个柿子. 我们将\(B\)的权值看作是收益的话,\(C\)的权值就是花费. 根据矩阵乘法的原理,只有当\(a[i]和a[j]\)都为\(1\) ...

  4. BZOJ 1324 Exca 神剑 最小割

    标题效果:鉴于加权值矩阵,带走一个地方的权利值之后,与其相邻的格儿童权利值变0.问多少可以取出到右值. 思维:Amber论文题目.不难建设,图着色.颜色从S连边,还有一种颜色向T连边.再把相邻的格子连 ...

  5. [ZJOI2011]最小割

    题解: 以前看过,思维挺神奇的一道题目 首先可以证明最小割是不能相交的 那么我们就可以找到任意两点求一次最小割然后将割的两边分开来再递归这个过程 另外最小割就是vis=0与vis=1之间的连边 分治的 ...

  6. 【BZOJ3630】[JLOI2014]镜面通道 几何+最小割

    [BZOJ3630][JLOI2014]镜面通道 Description 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表 ...

  7. 「SHOI2007」「Codevs2341」 善意的投票(最小割

    2341 善意的投票 2007年省队选拔赛上海市队选拔赛 时间限制: 5 s 空间限制: 128000 KB 题目等级 : 大师 Master   题目描述 Description 幼儿园里有n个小朋 ...

  8. BZOJ 2039:[2009国家集训队]employ人员雇佣(最小割)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2039 题意:中文题意. 思路:一开始想着和之前做的最大权闭合图有点像,但是如果把边全部当成点的话,那 ...

  9. UVALive 7264 Kejin Game 网络流+最小割

    Kejin Game 题意:一个人有一颗技能树, 现在它想修练到某个技能 (假设为x), 现在修一个技能有3种方式: 1, 将该技能的前置技能都学完了,才能学该技能. 2, 取消一个技能 与 另一个技 ...

随机推荐

  1. 浅谈设计模式及python实现

    设计模式及Python实现   设计模式是什么? Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样你就能一次又一次地使用 ...

  2. Task CancellationTokenSource和Task.WhenAll的应用

    Task是.net4.0推出的异步编程类,与ThreadPool.QueneUserWorkItem方法类似的是,Task也是使用线程池来工作的.但Task比起这个QueneUserWorkItem的 ...

  3. ipad pro 为什么不行

    TalkingData公布的数据显示,iPad Pro在中国发行首月的销量仅为49 300台,而此前iPad Air 2发行首月后销量曾高达55.7万台.那么到底是什么原因,让这个被寄予厚望的iPad ...

  4. java高并发系列 - 第22天:java中底层工具类Unsafe,高手必须要了解

    这是java高并发系列第22篇文章,文章基于jdk1.8环境. 本文主要内容 基本介绍. 通过反射获取Unsafe实例 Unsafe中的CAS操作 Unsafe中原子操作相关方法介绍 Unsafe中线 ...

  5. 【Java例题】3.1 7、11、13的倍数

    1.找出1~5000范围内分别满足如下条件的数: (1) 7或11或13的倍数 (2) 7.11,或7.13或11.13的倍数 (3) 7.11和13的倍数. package chapter3; pu ...

  6. SpringBoot配置web访问H2

    [**前情提要**]最近开始搭建博客,在本地调试的时候使用的数据库是h2,但是调试的时候需要查看数据库,本文也由此而来. --- 下面是我用到的方法: 1. 使用IDEA的Database连接工具,具 ...

  7. LeetCode刷题总结之双指针法

    Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...

  8. 基于Starling的mask实现

    作为一个从c++转过来的程序员,flash原生的自定义mask实在是太好用,能方便实现各种效果,比如新手引导的高亮.viewport效果等.可惜starling的显示对象并不支持mask特性,查阅go ...

  9. Opengl_入门学习分享和记录_02_渲染管线(一)顶点着色器&片段着色器

    写在前面的废话:今天俺又来了哈哈,真的好棒棒! 今天的内容:之前我们大概描述了,我们自己定义的顶点坐标是如何被加载到GPU之中,并且介绍了顶点缓冲对象VBO用于管理这一块内存.今天开始详细分析它的具体 ...

  10. Shell脚本书写规范

    在日常的运维工作中,Shell脚本肯定是必不可少的工作内容.为方便问题排查.脚本执行历史问题追踪.方便大家共同维护,从网上搜罗结合以往的经验教训拟定以下Bash脚本书写规范.欢迎各位同学指正或补充. ...