ferinの競プロ帳

競プロについてのメモ

JAG2019 Day3

ABC はい
E DP
D 2SAT
H UFマージテク
G 期待値で式変形を頑張る
I 係数がパスカルの三角形になってる FFTでやる
J 行列を構築するやつ
F よくわからん

D

x_i = (iを集合に入れるならtrue) とする
XORについてのclosureを (not x_i) or (not x{i xor X}) と (x_i) or (x{i xor X}) の両方入れないといけないことに注意
AND, ORは部分集合の列挙でO(3n)でできる

https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3883568

E

dp[i問目まで][赤をj個][赤の残量k]
dp[n][i][j] で赤と黒それぞれ足りてれば chmin(ans, dp[n][i][j])
足りてるやつがなければ-1

累積和のindexでごちゃごちゃやるの初心者か?

https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3883738

H

c_iとd_iをつないだグラフで \sum_連結成分 min(頂点数,辺数) が答え
各頂点を根とする部分木を表すUnionFindと辺の集合を持ってマージテクでマージする
UnionFind全てにK色分の情報をもたせると終わるのでmapかunordered_mapで必要なところだけもつ

dfsの内部のマージ処理をmerge関数に切り分けたらREが消えた
RE: https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3884172
AC: https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3884159

スタック領域を広げるやつを使ったけどREだった
https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3884229
構造体をswapするのがまずいのかと思って参照渡ししてswapするのを書いたけどRE
https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3884250

わからん

G

連結成分の個数 = 頂点数 - 辺数
確率変数として

  •  X_{v_i} = Tの頂点 v_iが残るなら1で残らないなら0
  •  X_{e_i} = Tの辺 e_iが残るなら1で残らないなら0

と定める. U についても  Y_{v_j}, Y_{e_j} を同様に定める.期待値の線形性より
 E \lbrack (\sum_{i} X_{v_i} - \sum_{i} X_{e_i}) \times (\sum_{i} X_{v_i} - \sum_{i} X_{e_i}) \rbrack = \sum_{i,j} E \lbrack X_{v_i} Y_{v_j} \rbrack - E \lbrack X_{v_i} Y_{e_j}  \rbrack - E \lbrack X_{e_i} Y_{v_j} \rbrack + E \lbrack X_{e_i} Y_{e_j} \rbrack
となる.
 X_{v_i} Y_{v_j} v_i = v_j のとき0, v_i \neq v_j のとき1/4となる.
 X_{v_i} Y_{e_j} e_j の端点に  v_i があるとき0,ないなら1/8となる.
 X_{e_i} Y_{e_j} e_i e_j の端点に共通する頂点番号があれば0,ないなら1/16となる.

https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3891209

I

畳み込みに帰着 f:id:ferin_tech:20190927161324j:plain

これはNTTでやってる
https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3893071

NTTじゃなくてFFTでやったら落ちたので多分誤差
FFTでやって通ってるのもある https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3871633
long doubleにしたらFFTでも通った

実部と虚部にそれぞれ数列を埋め込むとFFT2回で畳み込みができる
A_x + iB_xをDFT したやつを掛け合わせて係数を合わせると畳み込みのDFTと一致することが確認できる

fft::multiply が本質
https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3895035

上位15bitと下位15bitに分割してそれぞれ畳み込むとdoubleで誤差が出ない範囲で収まると期待できる これはFFT4回 でできる https://min-25.hatenablog.com/entry/2017/09/23/085053
NTTで任意MOD畳み込みするより早い

fft::multiply_mod が本質
https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3895029

J

解説の通りに構築すると通ります どうやったら思いつくかは知りません
対角線で二等分して片方だけ構築すれば残りも自動的に決まる

https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day3/3895278

F

解けません