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

http://www.lydsy.com/JudgeOnline/problem.php?id=2406



题中式的含义为构造B矩阵

使得

B中每个元素在LR之间

且矩阵(A-B)的每一行的和的绝对值与每一列的和的绝对值构成的数集

最大值最小;

考虑枚举这个数集的上界;

这个可以二分;

当我们二分到一个上界后,考虑如何check;

check的过程实则是找到一组满足所有限制的解

可以用经典的行列间连边的网络流模型的有上下界版本来做;

建图为:
有n个点代表n行,m个点代表m列;

每行向每列连上界R下界L的边——表示B中每个点的大小限制;

S向每行连上界(A该行和+二分值)下界(A该行和-二分值)的边——表示当B的这一行和最大时,B这行和-A这行和不大于二分值;当B的这一行和最小时,A这行和-B这行和不大于二分值(列出式子化化看)

每行向T同理;

然后T向S连INF,产生循环流;

然后产生S’和T’将原图改成能通跑最大流得出可行流的新图,跑一跑,看看是否有可行流;

代码:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5 const int INF=0x3f3f3f3f;
  6 int L,R,N,M;
  7 int S,T,MD;
  8 int A[210][210];
  9 int sum_x[210],sum_y[210];
 10 struct ss{
 11     int to,next,f,cp;
 12 }e[200010];
 13 int first[1000],num,cut[1000],dep[1000],que[10000];
 14 int lim_line[1000];
 15 bool check(int );
 16 void bui_(int ,int ,int );
 17 void build(int ,int ,int );
 18 bool bfs();
 19 int dfs(int ,int );
 20 int main()
 21 {
 22     int i,j,k,l,r,mid;
 23     scanf("%d%d",&N,&M);
 24     for(i=1;i<=N;i++)
 25         for(j=1;j<=M;j++)
 26             scanf("%d",&A[i][j]),sum_x[i]+=A[i][j],sum_y[j]+=A[i][j];
 27     scanf("%d%d",&L,&R);
 28     l=0,r=200000,mid=(l+r)>>1;
 29     while(r-l>3){
 30         if(check(mid))
 31             r=mid;
 32         else
 33             l=mid+1;
 34         mid=(l+r)>>1;
 35     }
 36     for(mid=l;mid<=r;mid++)
 37         if(check(mid)){
 38             printf("%d\n",mid);
 39             return 0;
 40         }
 41     return 0;
 42 }
 43 bool check(int lim){
 44     int i,j,k,ans=0,add;
 45     memset(first,0,sizeof(first)),num=0;
 46     memset(lim_line,0,sizeof(lim_line));
 47     MD=N+M+1;
 48     S=MD+1,T=S+1;
 49     for(i=1;i<=N;i++){
 50         j=max(0,sum_x[i]-lim);
 51         k=sum_x[i]+lim;
 52         lim_line[MD]-=j;
 53         lim_line[i]+=j;
 54         bui_(MD,i,k-j);
 55     }
 56     for(i=1;i<=M;i++){
 57         j=max(0,sum_y[i]-lim);
 58         k=sum_y[i]+lim;
 59         lim_line[MD]+=j;
 60         lim_line[i+N]-=j;
 61         bui_(i+N,MD,k-j);
 62     }
 63     for(i=1;i<=N;i++)
 64         for(j=1;j<=M;j++){
 65             lim_line[i]-=L;
 66             lim_line[j+N]+=L;
 67             bui_(i,j+N,R-L);
 68         }
 69     for(i=1;i<=MD;i++)
 70         if(lim_line[i]){
 71             if(lim_line[i]>0)bui_(S,i,lim_line[i]),ans+=lim_line[i];
 72             else             bui_(i,T,-lim_line[i]);
 73         }
 74     while(bfs())
 75         while(add=dfs(S,INF))
 76             ans-=add;
 77     return !ans;
 78 }
 79 void bui_(int f,int t,int fi){
 80     build(f,t,fi),e[num].cp=num+1;
 81     build(t,f,0),e[num].cp=num-1;
 82 }
 83 void build(int f,int t,int fi){
 84     e[++num].next=first[f];
 85     e[num].to=t,e[num].f=fi;
 86     first[f]=num;
 87 }
 88 bool bfs(){
 89     int i,h=0,t=1;
 90     memset(dep,0,sizeof(dep));
 91     for(i=1;i<=T;i++)cut[i]=first[i];
 92     que[t]=S,dep[S]=1;
 93     while(h<t){
 94         h++;
 95         for(i=first[que[h]];i;i=e[i].next)
 96             if(e[i].f&&!dep[e[i].to]){
 97                 dep[e[i].to]=dep[que[h]]+1;
 98                 if(e[i].to==T)return true;
 99                 que[++t]=e[i].to;
100             }
101     }
102     return dep[T];
103 }
104 int dfs(int now,int flow){
105     int i,ret=0;
106     if(now==T)
107         return flow;
108     for(i=cut[now];i;i=e[i].next)
109         if(e[i].f&&dep[e[i].to]==dep[now]+1){
110             cut[now]=i;
111             ret=dfs(e[i].to,min(flow,e[i].f));
112             if(ret){
113                 e[i].f-=ret;
114                 e[e[i].cp].f+=ret;
115                 return ret;
116             }
117         }
118         else    cut[now]=i;
119     return ret;
120 }

存在的问题:

由于这个题是从学姐的summary里找到的;

所以一开始就相信是二分题;

如果对二分没有一定信仰的话,不知道还能不能做出来;

转载于:https://www.cnblogs.com/nietzsche-oier/p/8528534.html

bzoj 2406: 矩阵 ——solution相关推荐

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 二分答案.把 b 的 n 个行作为一排, m 个列作为一排,每行和每列之间连上下界为 ...

  2. BZOJ 2406 LuoguP4194 矩阵 有上下界可行流

    分析: 这道题乍一看--卧槽这都什么玩意-- 然后发现给了个A矩阵,要求一个可行的B矩阵,使得矩阵C=A-B的每一行的和的绝对值和每一列的和的绝对值的最大值最小-- 好拗口啊-- 什么最大值最小之类的 ...

  3. bzoj 3120 矩阵优化DP

    我的第一道需要程序建矩阵的矩阵优化DP. 题目可以将不同的p分开处理. 对于p==0 || p==1 直接是0或1 对于p>1,就要DP了.这里以p==3为例: 设dp[i][s1][s2][r ...

  4. [上下界网络流][二分] Bzoj P2406 矩阵

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

  5. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  6. BZOJ 2738: 矩阵乘法 [整体二分]

    给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 愚蠢的名字...... 整体二分,影响因子就是矩阵里的数 把$\le mid$的矩阵元素加到二维树状数组里然后询问分成两组就行 ...

  7. 输入挂(bzoj 2901: 矩阵求和)

    很少用输入挂,以为不超时就好了,但是这题貌似不用过不去啊 只好拿出来用了,当个模板 原理是用getchar()读入会比用scanf快一些 int Read() {int x = 0, f = 1;ch ...

  8. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详(并不)解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多 ...

  9. BZOJ 2901: 矩阵求和

    2901: 矩阵求和 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 411  Solved: 216 [Submit][Status][Discus ...

最新文章

  1. 软件开发人员标准薪金 人月_软件产品测试周期
  2. CCNA战报每日更新
  3. python绘制3维图-Python 绘制 3 维以上的高维图
  4. mybatis动态代理
  5. 人工智能的发展趋势和行业岗位
  6. mysql 8添加账号赋予权限
  7. Python爬虫实战之(五)| 模拟登录wechat 1
  8. redis基本数据类型之String
  9. HADOOP:Current usage: 399.9 MB of 1 GB physical memory used; 2.5 GB of 2.1 GB virtual memory used.
  10. mac下ssh 报错:localhost: ssh: connect to host localhost port 22: Connection refused
  11. linux密码特殊字符识别
  12. Modifying a Dynamic Library Without Changing the Source Code
  13. PyCharm - Compare With... (文件比较)
  14. 注册表中shell文件不见了_win10系统注册表中的shell文件不小心被删除的恢复教程...
  15. 上海高中开设计算机课,如何提升高中计算机课的趣味性
  16. 电车难题和他的n个**变种分享
  17. 计算机网络英文简称汇总
  18. 虚拟机:虚拟机三种网络连接
  19. R语言read.csv()读入行不规则数据
  20. iftop工具(网卡流量监控软件)的使用

热门文章

  1. python有趣小程序 表白-抖音最火的整蛊表白小程序如何做出来的?教你用python做出...
  2. python简单代码画皮卡丘-实现童年宝可梦,教你用Python画一只属于自己的皮卡丘...
  3. python入门编程软件免费-Python 3.7.0编程软件免费下载
  4. python生成条形图-Python处理JSON数据并生成条形图
  5. python怎么用excel-python怎么连接excel
  6. python程序员工作怎样-现在Python就业薪资高吗?Python程序员前景怎么样?
  7. python 调用linux命令-Python 调用系统命令
  8. 看漫画学python电子书-看漫画还能学Python❓❓❓| 0基础小白福音
  9. python最新版下载教程-各种版本的Python下载安装教程
  10. deep learning with python 中文版-Deep Learning with Python