题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406

二分答案。把 b 的 n 个行作为一排, m 个列作为一排,每行和每列之间连上下界为 L , R 的边,源点向每行连以 “ a 的该行的值的和” 加/减 mid 为上下界的边,每列向汇点连以 “ a 的该列的值的和” 加/减 mid 为上下界的边;然后跑可行流就行了。

自己把和超级源点及超级汇点的无关的边先连好了,到时候改一改容量就行了。但别忘了把 hd[ ] , cap[ ] , xnt , tp[ ] 都赋回原来的值。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=N*N<<,INF=4e7+;
int n,m,yhd[N<<],hd[N<<],xnt=,cur[N<<],bj,to[M],nxt[M],ycap[M],cap[M],dy[N<<];
int sh[N],sl[N],s,t,ss,tt,tp[N<<],ttp[N<<];
int dfn[N<<],q[N<<],he,tl;
int Mn(int a,int b){return a<b?a:b;}
int Mx(int a,int b){return a>b?a:b;}
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
void add(int x,int y,int z)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;cap[xnt]=z;
to[++xnt]=x;nxt[xnt]=hd[y];hd[y]=xnt;cap[xnt]=;
}
bool bfs(int mid)
{
memset(dfn,,sizeof dfn);dfn[ss]=;
q[he=tl=]=ss;
while(he<=tl)
{
int k=q[he++];
for(int i=hd[k],v;i;i=nxt[i])
if(!dfn[v=to[i]]&&cap[i])
dfn[v]=dfn[k]+,q[++tl]=v;
}
return dfn[tt];
}
int dinic(int cr,int flow)
{
if(cr==tt)return flow;
int use=;
for(int& i=cur[cr],v;i;i=nxt[i])
if(dfn[v=to[i]]==dfn[cr]+&&cap[i])
{
int tmp=dinic(v,Mn(flow-use,cap[i]));
if(!tmp)dfn[v]=;
use+=tmp;cap[i]-=tmp;cap[i^]+=tmp;
if(use==flow)return use;
}
return use;
}
bool chk(int mid)
{
xnt=bj;memcpy(ttp,tp,sizeof tp);
memcpy(hd,yhd,sizeof yhd);//
for(int i=;i<=bj;i++)cap[i]=ycap[i];///
for(int i=;i<=n;i++)
{
int l=Mx(sh[i]-mid,),r=sh[i]+mid;
cap[dy[i]]=r-l;cap[dy[i]^]=;
ttp[i]+=l;ttp[s]-=l;
}
for(int i=;i<=m;i++)
{
int l=Mx(sl[i]-mid,),r=sl[i]+mid;
cap[dy[i+n]]=r-l;cap[dy[i+n]^]=;
ttp[i+n]-=l;ttp[t]+=l;
}
int val=;
for(int i=;i<=t;i++)
if(ttp[i]>)add(ss,i,ttp[i]),val+=ttp[i];
else if(ttp[i]<)add(i,tt,-ttp[i]);
while(bfs(mid))
memcpy(cur,hd,sizeof hd),val-=dinic(ss,INF);
return !val;
}
int main()
{
n=rdn();m=rdn();
for(int i=,d;i<=n;i++)
for(int j=;j<=m;j++)
d=rdn(),sh[i]+=d,sl[j]+=d;
int L=rdn(),R=rdn();
s=;t=n+m+; ss=n+m+;tt=n+m+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
add(i,j+n,R-L),tp[i]-=L,tp[j+n]+=L;
add(t,s,INF);
for(int i=;i<=n;i++)
add(s,i,),dy[i]=xnt-;
for(int i=n+,j=n+m;i<=j;i++)
add(i,t,),dy[i]=xnt-;
bj=xnt;
memcpy(yhd,hd,sizeof hd);
for(int i=;i<=bj;i++)ycap[i]=cap[i];
int l=,r=2e5+,ans;
while(l<=r)
{
int mid=l+r>>;
if(chk(mid))ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
return ;
}

bzoj 2406 矩阵——有源汇上下界可行流的更多相关文章

  1. bzoj 2406 矩阵 —— 有源汇上下界可行流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界: 有上下界可行流原 ...

  2. POJ2396 Budget [有源汇上下界可行流]

    POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...

  3. 有源汇上下界可行流(POJ2396)

    题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...

  4. 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]

    题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...

  5. poj2396 Budget(有源汇上下界可行流)

    [题目链接] http://poj.org/problem?id=2396 [题意] 知道一个矩阵的行列和,且知道一些格子的限制条件,问一个可行的方案. [思路] 设行为X点,列为Y点,构图:连边(s ...

  6. 算法复习——有源汇上下界可行流(bzoj2396)

    题目: Description We are supposed to make a budget proposal for this multi-site competition. The budge ...

  7. poj2396有源汇上下界可行流

    题意:给一些约束条件,要求算能否有可行流,ps:刚开始输入的是每一列和,那么就建一条上下界相同的边,这样满流的时候就一定能保证流量相同了,还有0是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...

  8. bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2406 设矩阵C=A-B 最小化 C 一行或一列和的最大值 整体考虑一行或者一列的和 二分最大值 这样 ...

  9. ZOJ1994有源汇上下界可行流

    http://fastvj.rainng.com/contest/236779#problem/G Description: n 行 m 列 给你行和 与 列和 然后有Q个限制,表示特定单元格元素大小 ...

随机推荐

  1. vue router使用query和params传参的使用

    传参是前端经常需要用的一个操作,很多场景都会需要用到上个页面的参数,本文将会详细介绍vue router 是如何进行传参的,以及一些小细节问题.有需要的朋友可以做一下参考,希望可以帮到大家. Vue ...

  2. Git 从了解到放弃

    1. 简单介绍 1.1. git起源 在1991年linus创建了Linux从此linux成为服务器领域的佼佼者,大部分web服务器.邮件.数据库各种服务器端程序都安装在了linux上面运行,主要是因 ...

  3. [Web UI]对比Angular/jQueryUI/Extjs:没有一个框架是万能的

    Angular不能做什么?对比Angular/jQueryUI/Extjs 框架就好比兵器,你得明白你手里拿的是屠龙刀还是倚天剑,刀法主要是砍,剑法主要是刺.对于那些职业喷子和脑残粉,小僧送你们两个字 ...

  4. MYSQL-实现分组排序 对比 ORACLE 和SQLserver用 row_number() over(partition by ) 分组排序功能

    以下是个人笔记: 本文是为了理解 row_number() over(partition by )  和实现各种数据库的分组排序功能 select ROW_NUMBER()over( partitio ...

  5. PHP exec()函数的介绍和使用DEMO

    exec()函数用来执行一个外部程序,我们再用这函数基本是在linux. 开启exec()函数: exec()函数是被禁用的,要使用这个函数必须先开启.首先是 要关掉 安全模式 safe_mode = ...

  6. 20165202 week10课下补做

    相关知识点总结 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort( ...

  7. (转)MapReduce Design Patterns(chapter 7 (part 2))(十四)

    External Source Input Pattern Description 这种模式不从hdfs加载数据,而是从hadoop以外系统,例如RDB或web service加载. Intent 想 ...

  8. python︱用pyodbc连接数据库

    直接连接数据库和创建一个游标(cursor) 数据查询(SQL语句为 select -from..where) 1.pyodbc连接 import pyodbc cnxn = pyodbc.conne ...

  9. 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/74161115 引言 最近在测试EasyNVR ...

  10. XOR Queries(莫队+trie)

    题目链接: XOR Queries 给出一个长度为nn的数组CC,回答mm个形式为(L, R, A, B)(L,R,A,B)的询问,含义为存在多少个不同的数组下标k \in [L, R]k∈[L,R] ...