【BZOJ2406】矩阵

Description

Input

第一行两个数n、m,表示矩阵的大小。

接下来n行,每行m列,描述矩阵A。

最后一行两个数L,R。

Output

第一行,输出最小的答案;

Sample Input

2 2
0 1
2 1
0 1

Sample Output

1

HINT

对于100%的数据满足N,M<=200,0<=L<=R<=1000,0<=Aij<=1000

题解:容易想到二分,并且这个和式可以拆成$\sum A_{ij}-\sum B_{ij}$的形式,然后就需要你看出来这是个有上下界的网络流问题了,设二分的答案为mid,建图方法如下:

1.S->第i行 下界$\sum\limits_{j=1}^m A_{ij}$-mid,上界$\sum\limits_{j=1}^m A_{ij}$+mid
2.第j列->T 下界$\sum\limits_{i=1}^n A_{ij}$-mid,上界$\sum\limits_{i=1}^n A_{ij}$+mid
3.第i行->第j列 下界L,上界R

然后跑可行流判定即可。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<int> q;
int n,m,ans,tot,S,T,SS,TT,L,R,cnt;
int A[210][210],sx[210],sy[210],m1[410],m2[410],to[1000010],next[1000010],val[1000010],head[410],d[410];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int dfs(int x,int mf)
{
if(x==TT) return mf;
int i,temp=mf,k;
for(i=head[x];i!=-1;i=next[i])
{
if(d[to[i]]==d[x]+1&&val[i])
{
k=dfs(to[i],min(temp,val[i]));
if(!k) d[to[i]]=0;
val[i]-=k,val[i^1]+=k,temp-=k;
if(!temp) break;
}
}
return mf-temp;
}
int bfs()
{
while(!q.empty()) q.pop();
memset(d,0,sizeof(d));
q.push(SS),d[SS]=1;
int i,u;
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i])
{
if(!d[to[i]]&&val[i])
{
d[to[i]]=d[u]+1;
if(to[i]==TT) return 1;
q.push(to[i]);
}
}
}
return 0;
}
bool check(int x)
{
int i,j,a,b;
memset(head,-1,sizeof(head)),tot=ans=cnt=0;
memset(m1,0,sizeof(m1)),memset(m2,0,sizeof(m2));
S=n+m+1,T=S+1,SS=T+1,TT=SS+1;
for(i=1;i<=n;i++)
{
a=max(sx[i]-x,0),b=sx[i]+x;
m1[S]+=a,m2[i]+=a,add(S,i,b-a);
}
for(i=1;i<=m;i++)
{
a=max(sy[i]-x,0),b=sy[i]+x;
m1[i+n]+=a,m2[T]+=a,add(i+n,T,b-a);
}
for(i=1;i<=n;i++) for(j=1;j<=m;j++) add(i,j+n,R-L),m1[i]+=L,m2[j+n]+=L;
for(i=1;i<=n+m+2;i++)
{
if(m1[i]>m2[i]) tot+=m1[i]-m2[i],add(i,TT,m1[i]-m2[i]);
if(m1[i]<m2[i]) add(SS,i,m2[i]-m1[i]);
}
add(T,S,1<<30);
while(bfs()) ans+=dfs(SS,1<<30);
return ans==tot;
}
int main()
{
n=rd(),m=rd();
int i,j,a;
for(i=1;i<=n;i++) for(j=1;j<=m;j++) a=rd(),sx[i]+=a,sy[j]+=a;
L=rd(),R=rd();
int l=0,r=40000000,mid;
while(l<r)
{
mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d",r);
return 0;
}//1 3 6 6 6 1 10

【BZOJ2406】矩阵 二分+有上下界的可行流的更多相关文章

  1. HDU Destroy Transportation system(有上下界的可行流)

    前几天正看着网络流,也正研究着一个有上下界的网络流的问题,查看了很多博客,觉得下面这篇概括的还是相当精确的: http://blog.csdn.net/leolin_/article/details/ ...

  2. ZOJ 2314 带上下界的可行流

    对于无源汇问题,方法有两种. 1 从边的角度来处理. 新建超级源汇, 对于每一条有下界的边,x->y, 建立有向边 超级源->y ,容量为x->y下界,建立有向边 x-> 超级 ...

  3. [ACdream 1211 Reactor Cooling]无源无汇有上下界的可行流

    题意:无源无汇有上下界的可行流 模型 思路:首先将所有边的容量设为上界减去下界,然后对一个点i,设i的所有入边的下界和为to[i],所有出边的下界和为from[i],令它们的差为dif[i]=to[i ...

  4. 【bzoj2406】矩阵 二分+有上下界可行流

    题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...

  5. BZOJ2406矩阵——有上下界的可行流+二分答案

    题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...

  6. SGU 194 Reactor Cooling Dinic求解 无源无汇有上下界的可行流

    题目链接 题意:有向图中有n(1 <= n <= 200)个点,无自环或者环的节点个数至少为3.给定每条边的最小流量和最大流量,问每条边的可行流量为多少? 思路:一般求解的网络流并不考虑下 ...

  7. bzoj 2406 二分+有源有汇上下界网络流可行流判定

    弱爆了,典型的行列建模方式,居然想不到,题做少了,总结少了...... 二分答案mid s----------------------->i行-----------------------> ...

  8. sgu 194 上下界网络流可行流判定+输出可行流

    #include <cstdio> #include <cstring> #define min(a,b) ((a)<(b)?(a):(b)) #define oo 0x ...

  9. zoj3229 Shoot the Bullet(有源汇有上下界的最大流)

    题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...

随机推荐

  1. springBoot 环境

    环境约束 jdk1.8:Spring Boot 推荐jdk1.7及以上:maven3.x:maven 3.3以上版本:Apache Maven 3.3.9.IntelliJIDEA2017:Intel ...

  2. AC日记——[国家集训队2010]小Z的袜子 cogs 1775

    [国家集训队2010]小Z的袜子 思路: 传说中的莫队算法(优雅的暴力): 莫队算法是一个离线的区间询问算法: 如果我们知道[l,r], 那么,我们就能O(1)的时间求出(l-1,r),(l+1,r) ...

  3. MySQL的XA_prepare_event类型binlog的解析

    为了支持新版的xa事务,MySQL新加了一种binlog event类型:XA_prepare 项目中使用的开源组件mysql-binlog-connector-java无法解析此种binlog ev ...

  4. mfoc安装编译

    系统环境 UBUNTU16.04,要安装好各种基础的编译环境,这就不说了,如果不知道需要什么,那就编译时出错时看到什么安装什么吧 下载源码包libnfc, mfoc, mfcuk,都是github上, ...

  5. Speech to Text for iOS

    找了一下 speech to text 可以用的 SDK for iOS 以下幾種方案: NDEV Mobile (有免費方案,不過似乎不支援離線,客戶清單中有 wallmart,支援不少語言) iS ...

  6. cocos2dx 2.x新建项目

    举例: cocos2d-x-2.2.6/tools/project-creator 进入 这个文件夹 chmod 777 project-cereator.py ./create_project.py ...

  7. eos智能合约执行流程

    eos智能合约执行 1. 执行流程 controller::push_transaction()  // 事务 -> transaction_context::exec()  // 事务 -&g ...

  8. 线段树专题—ZOJ1610 Count the Colors

    题意:给一个n,代表n次操作,接下来每次操作表示把[l.r]区间的线段涂成k的颜色当中,l,r,k的范围都是0到8000 分析:事实上就是拿线段树维护一段区间的颜色,整体用到的是线段树的区间更新把,可 ...

  9. HDU2550 百步穿杨

    百步穿杨 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  10. AAuto如何设置combobox

    1 在左侧点击下拉组合框,然后再界面中拖拉一个组合框,鼠标单击这个下拉组合框,哟蹙额就可以设置名称,items,文本,其中文本是默认显示的文字,而item是点击之后的东西,中间用";&quo ...