題意簡述:給定乙個整數矩陣 a[
n×m]
,求乙個矩陣 b[
n×m]
,滿足 ∀1
≤i≤n
,1≤j
≤m,b
i,j∈
[l,r
] ,且使下式值最小:ma
x⎧⎩⎨
⎪⎪⎪⎪
max1
≤j≤m
max1
≤i≤n
⎧⎩⎨⎪
⎪∣∣∣
∣∑j=
1m(a
i,j−
bi,j
)∣∣∣
∣⎫⎭⎬
⎪⎪⎫⎭
⎬⎪⎪⎪
⎪ 輸出任意一組合法解即可。n,
m≤200,0≤
l≤r≤
103,0
≤ai,
j≤103
這題我考場上就直接棄題了,因為本來是想寫隨機調整的,結果因為有些細節想做得精細一點,就覺得很麻煩,比如找到瓶頸行或瓶頸列,在上面隨機修改乙個能改的點,我一直在糾結怎麼很快找到乙個能改的點,然而xyx就直接遇到不能改的就跳過,隨下乙個,感覺這樣才是隨機化的正確姿勢嘛。
正解是網路流,是經典的矩陣的建圖,左側乙個點代表一行,右側乙個點代表一列,點上的限制放在左右點的連邊的流量限制上,二分答案,然後就有了行和列的限制,放在右側點與匯點的連邊上。
richard peng今天也講到網路流也像是隨機調整。
網路流:
#include
const int n = 205;
const int p = n * 2;
const int m = n * n * 4;
const int inf = 1e9;
template void read(t &x)
int n, m, a[n][n], b[n][n], sa[n], sb[n], l, r, s, t, source, sink, in[p], out[p], first[p], cur[p], q[p], h[p], s;
struct edge mp[m];
void ins(int
x, int
y, int v) ; first[x] = s;
mp[++s] = (edge) ; first[y] = s;
}void insert(int
x, int
y, int l, int r)
void build(int
x)bool bfs()
}return0;}
int dfs(int
x, int f)
h[x] = -1;
return used;
}bool check(int
x) int main()
printf("%d\n",l);
check(l);
for (int i=n+1; i <= n+m; i++)
for (int t=first[i]; t; t=mp[t].next)
if (mp[t].y >= 1 && mp[t].y
<= n)
b[mp[t].y][i - n] = mp[t].v + l;
for (int i=1; i <= n; i++)
return
0;}
貪心:
#include
const
int n = 205;
const
int inf = 2e6;
int n, m, l, r, a[n][n], b[n][n], sa[n*2], sb[n*2], max_det, c1, c2, r;
template
void read(t &x)
void calc_det()
int qry(int x, int y, int c)
void chg(int x, int y, int c)
int main()
for (int j=1; j <= m; j++)
if (abs(sa[n + j] - sb[n + j]) == max_det)
}calc_det();
printf("%d\n",max_det);
for (int i=1; i <= n; i++)
return
0;}
日常訓練 壓縮
巨大的文字往往令人頭疼,特別是文字內容有大量重複的情況下,巨大的文字不便於運輸和閱讀,於是我們提出了noip nonsense obivous index pattern 荒謬的顯然索引法 一種 有效的 壓縮文字的方法。noip壓縮後的格式很特別,乙個文字壓縮後由若干個單元組成,每個單元由3部分組成...
日常訓練 Tree
j 對於h u j 時間複雜度的證明也是比較經典了,每次列舉的是sz eu s zev 相當於每次從a,b 中各任選一點,它們的lc a 為 u 這樣的點對列舉不會重複,因此總的時間複雜度為o n2 include include include include include using name...
日常訓練 mod
給定 p 1,p 2,p n,b 1,b 2,b m 求滿足 x mod p 1 equiv a 1,x mod p 2 equiv a 2,x mod p n equiv a n 的 x 對 b 1,b 2,b m 取模的結果.第一行兩個整數 n,m 接下來 n 行,每行有乙個整數 a i 接下來...