思路:
矩陣a為乙個n*m的矩陣
矩陣a的轉置 a
ta^t
at即為乙個m*n的矩陣,其中 ai,
jt=a
j,
ia^t_=a_
ai,jt
=aj,
i有(a∗
b−c)
∗ata
∗b∗a
t−c∗
at
(a*b-c)*a^t\\ a*b*a^t-c*a^t
(a∗b−c
)∗at
a∗b∗
at−c
∗at對於b中的乙個數 bi,
jb_
bi,j
,它的貢獻為 bi,
j∗ai
∗a
jb_*a_*a_
bi,j∗
ai∗
aj,當 aia_
ai 與 aja_
aj 都為1時,bi,
jb_
bi,j
有貢獻
對於c中的乙個數 ci,
jc_
ci,j
,它的貢獻為 ci∗
ai
c_*a_
ci∗ai
,當 aia_
ai 為1時,cic_
ci 有貢獻
於是考慮最小割
先全選 bi,
jb_
bi,j
,然後割去最少的 bi,
jb_
bi,j
與 cic_
ci兩點間連inf邊表示兩點不可分割
於是源點向 bi,
jb_
bi,j
連邊,流量為 bi,
jb_
bi,jbi,
jb_
bi,j
向 cic_
ci 和 cjc_
cj 連邊,流量為inf
c ic_
ci 向匯點連邊,流量為 cjc_
cj**:
#include
using
namespace std;
#define in read()
#define s 0
#define t n*(n+1)+1
inline
int in
const
int a=
1e3+5;
const
int b=
2e6+5;
const
int inf=(1
<<30)
;int n;
int a[a]
[a],b[a]
;int head[b]
,tot_road=1;
struct roadroad[
2*b]
;inline
void
ljb(
int x,
int y,
int w)
;head[x]
=tot_road;
}inline
intd1
(int x,
int y)
inline
intd2
(int x)
inline
void
scan()
inline
void
build()
else
}for
(int i=
1;i<=n;i++
)ljb(d2
(i),t,b[i]),
ljb(t,
d2(i),0
);return;}
int maxflow=0;
int dep[b]
,sum[b]
;inline
void
bfs()}
return;}
inline
intdfs
(int x,
int flow)
int used=0;
for(
int y=head[x]
;y;y=road[y]
.nex)}if
(used==flow)
return used;}if
(!--sum[dep[x]
]) dep[t]
=t+1
; sum[
++dep[x]]++
;return used;
}inline
void
isap()
inline
void
print()
signed
main()
某 SCOI 模擬賽 T1 a DP
有 n nn 個單詞,每個單詞出現 c ic i ci 次,現用 與.給單詞編碼,要求任意乙個單詞的編碼不是另乙個的字首。設 的權值為 2,的權值為 1,最小化所有單詞的權值和。n 750 n leq 750 n 750。假設我們已經建好了所有單詞的字典樹,顯然出現次數越多的單詞應該掛在越淺的葉子 ...
20200717 SCOI模擬T1(計數)
description 毒瘤出題人給了你乙個由且僅由小寫字母構成的字串,並且多次詢問你一段區間的字元組成的字串中,noi 子串行出現的次數。輸入輸入資料從noi.in讀入 第一行兩個整數n,m表示字串的長度和詢問次數第二行乙個由小寫字母組成的字串s,下標從1開始標號然後一行乙個整數seed,含義請參...
20200916 SCOI模擬T1(三分)
思路 設怪物的屬性為 a,b a,ba,b,環境值為 x,y x,yx,y t x yt frac t yx 每個怪的貢獻為 a b at b ta b frac b times t a b ta b t發現是乙個單峰函式 打表發現總貢獻也是單峰的,於是可以三分 開口向上的單峰函式的max也是單峰的...