2021年10月2日土曜日

第八回 アルゴリズム実技検定

満点だった。

L - K番目の絶対値

総和の絶対値がDD以下であるような連続部分列を数える問題が解ければよさそう。累積和Si=A1+...+AiS_i = A_1 + ... + A_i上で言い換えると各iiについてSiSjD|S_i-S_j| \le Dであるようなj<ij < iを数えればよく、これはS0,S1,...,Si1S_0, S_1, ..., S_{i-1}の中で[SiD,Si+D][S_i-D, S_i+D]に含まれるようなものを数えることに等しい。数え上げをO(NlogN){O}(N \log N)で解くと、全体でO(NlogNlogiAi){O}(N \log N \log \sum_i |A_i|)

順序対を数えることにすれば尺取りでできる。確かに。

M - バランス

SoundHound Inc. Programming Contest 2018 Masters Tournament E - + Graph

O - 色分けトーナメント

  • トーナメントは22N12 \cdot 2^N-1頂点の完全二分木とすると、制約(Wi,Li)(W_i, L_i)WiW_iLiL_iのLCAまでWiW_iLiL_iが勝ち上がってWiW_iが勝つこととみなせる。
  • ある選手を青に塗ると決めても赤に塗ると決めても有効な塗り方は同数ある。(どの有効な塗り方についても、すべての色を反転したものが有効な塗り方であるため。)

dpv[x]=\operatorname{dp}_v[x] =頂点vvを根とする部分木に属する左からxx番目の選手の色を決め打った時に、部分木vvに属する選手の塗り方で(部分木vvに含まれる制約を満たし、かつ)vvが勝ち上がるようなものの総数、とする。dpv\operatorname{dp}_vvvの子をc1,c2c_1, c_2としてdpc1,dpc2\operatorname{dp}_{c_1}, \operatorname{dp}_{c_2}から線形で作れるので、下から処理していけばよい。根に関するdp\operatorname{dp}の総和を2倍したものが答えになる。

各深さのdp\operatorname{dp}の長さの総和はちょうど2N2^Nになるので、全体の計算量はO(N2N+M){O}(N 2^N + M)