第一行兩個數n、m,表示矩陣的大小。
接下來n行,每行m列,描述矩陣a。
最後一行兩個數l,r。
第一行,輸出最小的答案;
2 20 1
2 10 1
1對於100%的資料滿足
n,m<=200,0<=l<=r<=1000,0<=aij<=1000
要求最大值最小,顯然二分答案。
每次二分乙個$mid$,設每行或每列的$a$之和為$va$,$b$之和為$vb$,那麼就要求每行或每列的$va-mid\le vb\le va+mid$,判斷是否有可行解。
將源點與每行連邊,流量上下界為$[va-mid,va+mid]$;每列與匯點連邊,流量上下界為$[va-mid,va+mid]$;
每行與每列連邊,流量上下界為$[l,r]$。
每次二分跑一遍有源匯的上下界可行流判斷是否滿流即可。
注意$va-mid$要與$0$取$max$。
如果輸出方案的話,$b_$就是$l$加上第$i$行的點向第$j$列的點連的邊的反向邊流量。
#include#include#include#include#include#include#include#include#include#include#include#define ll long longusing namespace std;
int head[500];
int low[500];
int to[200010];
int val[200010];
int next[200010];
int tot=1;
int n,m;
int l,r;
int a[210][210];
int b[210][210];
int q[500];
int s,t;
int ss,tt;
int d[500];
int fx[210];
int fy[210];
int ans;
void add(int x,int y,int z)
bool bfs(int s,int t)
else
}return res==dinic();
}int main()
} scanf("%d%d",&l,&r);
int l=0,r=200000;
while(l<=r)
else
}printf("%d\n",ans);
// check(ans);
// for(int i=1;i<=n;i++)
// // }
// }
// for(int i=1;i<=n;i++)
// // }
// printf("\n");
// }
}
bzoj 2406 矩陣 (有上下界的網路流)
time limit 10 sec memory limit 128 mb submit 229 solved 90 submit status discuss 第一行兩個數n m,表示矩陣的大小。接下來n 行,每行 m列,描述矩陣a。最後一行兩個數l,r。第一行,輸出最小的答案 2 20 1 2 ...
上下界網路流判定 BZOJ 2406 矩陣
上下界網路流 二分答案轉化為判定問題 構造矩陣,使得每行每列之和分別滿足在乙個區間內,這就是帶上下界網路流判定問題。s i行 j列 t si mid,si mid l,r sj mid,sj mid 資料範圍看錯了 wa了好久.include include include includeusing...
bzoj2406 矩陣 二分 有上下界可行流
題目描述 輸入第一行兩個數n m,表示矩陣的大小。接下來n行,每行m列,描述矩陣a。最後一行兩個數l,r。輸出第一行,輸出最小的答案 樣例輸入 2 20 1 2 10 1 樣例輸出1題解 二分 有上下界可行流 題目一眼二分,問題轉化為判斷是否存在一種填數方式滿足行之和的差與列之和的差都不超過mid。...