ferinの競プロ帳

競プロについてのメモ

JAG夏合宿Day1

ABCDEJ → コンテスト中に解いた F: 凸関数 G: DP H: 2数の積の桁長 I: 誤差がやばい K: 畳み込み

K

1次元につぶす
https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day1/3873509

G

解説で素直なDPとなっているDPの一例を書く.A[i][j], B[i][j], D[i][j] を解説の通り定める.

初期値 A[0][0]=0, B[0][0]=1, D[0][0]=s[0][0]の数字

遷移 modを取るのは省略して書く

  • A[i][j]
    • A[i][j] = (A[i-1][j]+D[i-1][j]) + (A[i][j-1]+D[i][j-1]) (s[i][j]='+')
    • A{i][j] = A[i-1][j] + A[i][j-1] (s[i][j]='*' か 数字)
  • B[i][j]
    • B[i][j] = combi(i+j, i) (s[i][j]='+')
    • B[i][j] = D[i-1][j] + D[i][j-1] (s[i][j]='*')
    • B[i][j] = B[i-1][j] + B[i][j-1] (s[i][j]は数字)
  • D[i][j]
    • D[i][j] = 0 (s[i][j]='+' か '*')
    • D[i][j] = 10D[i-1][j]+dB[i-1][j] + 10D[i][j-1]+dB[i][j-1] (s[i][j]=d 数字)

答え
A[h-1][w-1] + D[h-1][w-1]

https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day1/3874148

H

  • クエリを「i行目のj文字目は何か?」に帰着するパート
    浮動小数点のような持ち方を考えると,2数の積の長さは それぞれの桁数の和+1+(仮数部の積が10以上か?) となる.仮数部でソートしておくと,仮数部の積が10以上になる最小のb[i]を二分探索で求められるので,i行目が何文字か?を求められる.

  • 行ごとにj文字目は何かを求めていくパート
    行yのj文字目が属するマス(y,x)が何か?を高速に求められればいい.xは二分探索で求まる.
    複数行について考える場合,仮数部が小さい行から順番に見ると数列に+1する更新しか飛んでこないのでBITで管理できる.

仮数部でソートするのは文字列にして辞書順ソートすると楽
サボってlog2個にしたけど普通に通った

https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day1/3874931

I

折れ線の集合をchtで持って交差する位置を二分探索で求める
TLも誤差も厳しすぎて泣いた

https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day1/3886846

F

凸関数のsum,maxを取っても凸関数が保持される
ユークリッド距離 sqrt((x1-x2)2+(y1-y2)2) は凸関数
k個の点の距離の和はsumを取ってるだけなので凸関数
nCk個のsumのmaxを取ると上位k個の和になるがこれは凸関数

凸関数なので三分探索をすればいい

https://onlinejudge.u-aizu.ac.jp/beta/review.html#JAGSummerCamp19Day1/3886897