題目描述
輸入第一行兩個數n、m,表示矩陣的大小。
接下來n行,每行m列,描述矩陣a。
最後一行兩個數l,r。
輸出第一行,輸出最小的答案;
樣例輸入
2 20 1
2 10 1
樣例輸出1題解
二分+有上下界可行流
題目一眼二分,問題轉化為判斷是否存在一種填數方式滿足行之和的差與列之和的差都不超過mid。
然後原來的和式就可以轉化為$|\sum\limits_^na_i-\sum\limits_^nb_i|\le mid$,即可得到$\sum\limits_^nb_i$的範圍。
對於每行和每列都得到乙個這樣的範圍,然後這就轉化為乙個經典的矩陣建圖模型:s向行連邊,表示每行的和;行向列連邊,表示每個數;列向t連邊,表示每列的和。
於是就可以使用有源匯有上下界可行流來判斷是否有解。
需要注意的一點是$\sum\limits_^nb_i$的下界不能是負數,因此減的時候需要判斷一下。
#include #include #include #define n 410#define m 100000
#define inf 1 << 30
using namespace std;
queueq;
int n , m , b , e , a[n][n] , sx[n] , sy[n] , head[n] , to[m] , val[m] , next[m] , cnt , low[n] , s , t , dis[n];
void add(int x , int y , int z)
bool bfs()
} }return 0;
}int dinic(int x , int low)
} return low - temp;
}bool judge(int mid)
while(bfs()) sum -= dinic(s , inf);
return !sum;
}int main()
printf("%d\n" , ans);
return 0;
}
BZOJ2406矩陣 有上下界的可行流 二分答案
第一行兩個數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...
BZOJ2406 矩陣 二分 有上下界的可行流
第一行兩個數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 題解 容易想到二分,並且這個和式可以拆成 sum a sum b 的形...
二分 上下界網路流 BZOJ2406 矩陣
題面在這裡 好題,好題啊!此題乍一看好像和網路流完全沒有關聯 其實暗藏玄機 題面不講人話 其實就是使矩陣a b的每一行每一列的絕對值的最大值最小 顯然可以看出要二分 列舉乙個當前的最大值m,則下式恆成立 s ai s bi m 等價於下式 sa i m sbi sai m 有同學可能不能理解,建議從...