BZOJ2406 矩陣 二分 有上下界的可行流

2022-05-20 08:17:39 字數 1180 閱讀 1887

第一行兩個數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_$的形式,然後就需要你看出來這是個有上下界的網路流問題了,設二分的答案為mid,建圖方法如下:

1.s->第i行 下界$\sum\limits_^m a_$-mid,上界$\sum\limits_^m a_$+mid

2.第j列->t 下界$\sum\limits_^n a_$-mid,上界$\sum\limits_^n a_$+mid

3.第i行->第j列 下界l,上界r

然後跑可行流判定即可。

#include #include #include #include using namespace std;

queueq;

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()

while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();

return ret*f;

}void add(int a,int b,int c)

int dfs(int x,int mf)

} return mf-temp;

}int bfs()

} }return 0;

}bool check(int x)

for(i=1;i<=m;i++)

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++)

printf("%d",r);

return 0;

}//1 3 6 6 6 1 10

bzoj2406 矩陣 二分 有上下界可行流

題目描述 輸入第一行兩個數n m,表示矩陣的大小。接下來n行,每行m列,描述矩陣a。最後一行兩個數l,r。輸出第一行,輸出最小的答案 樣例輸入 2 20 1 2 10 1 樣例輸出1題解 二分 有上下界可行流 題目一眼二分,問題轉化為判斷是否存在一種填數方式滿足行之和的差與列之和的差都不超過mid。...

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 矩陣

題面在這裡 好題,好題啊!此題乍一看好像和網路流完全沒有關聯 其實暗藏玄機 題面不講人話 其實就是使矩陣a b的每一行每一列的絕對值的最大值最小 顯然可以看出要二分 列舉乙個當前的最大值m,則下式恆成立 s ai s bi m 等價於下式 sa i m sbi sai m 有同學可能不能理解,建議從...