20200610 SCOI模擬T1(網路流)

2021-10-07 01:58:06 字數 2597 閱讀 8229

思路:

矩陣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,j​bi,

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也是單峰的...