2019年10月16日水曜日

Maximum-Cup 2013 F - 3人の騎士と1匹の犬

Maximum-Cup 2013 F - 3人の騎士と1匹の犬

魔力00の保有者はいかなる場合も不要なので最初に取り除き、MM11以上の魔力の保有者の総数としておく。

NMN \ge Mのケースは簡単で、マンハッタン距離をコストにして、MM個の騎士・魔力保有者のペアを作る最小重みマッチングを求めればよい。

N<MN < Mのケースが難しかった。魔力保有者をあらかじめ魔力の降順にソートしておいて、上位NN人の魔力保有者とのマッチングを考えればよいのだけれど、MAGICN\operatorname{MAGIC}_Nとちょうど同じ魔力を持つ者が複数人いたときに誰を選ぶかが問題になる。端的には、次のようにすればよい: (s,ts, tをフローの始点、終点とする)

  • ssから各騎士に、容量11、コスト00の辺を張る。
  • 各魔力保有者からttに、容量11、コスト00の辺を張る。
  • 各騎士からMAGICN\operatorname{MAGIC}_Nより大きな魔力の保有者に、容量11、コストがマンハッタン距離20000-20000の辺を張る。
  • 各騎士からちょうどMAGICN\operatorname{MAGIC}_Nの魔力の保有者に、容量11、コストがマンハッタン距離の辺を張る。

MAGICN\operatorname{MAGIC}_Nより大きな魔力の保有者が必ずマッチングに含まれるようにしたいので、20000-20000の補正を入れている。あとは流量NNの最小コストを求めて、20000×MAGICN20000 \times \operatorname{MAGIC}_Nより大きな魔力の保有者の数を足して戻せば答えになっている。

2019年10月15日火曜日

Indeedなう E - Page Rank

Indeedなう E - Page Rank

全部11のベクトルからスタートして、漸化式を1000回くらい回せば収束する。

正当性があまりわかってない。漸化式中の行列をAAとしたとき、つまりPR=0.1+APRPR = 0.1 + A \cdot PRとしたとき、

  1. AAの列毎の絶対値の和が11未満なのでA1<1\| A \|_1 <111ノルムについてはApAp\|A^p\| \le \|A\|^p成り立つ。したがってlimpAp\lim_{p \rightarrow \infty} A^p収束するので漸化式も収束する。(本当に?)1
  2. 収束するなら極限は漸化式の不動点になるから、漸化式を回すだけでよい。

くらいでわかった気になっておいた。


  1. 式変形で非正則な行列が出てこなければ大丈夫そう。非正則な場合は知らない。 ↩︎

2019年10月14日月曜日

KUPC 2019 D - Maximin Game

KUPC 2019 D - Maximin Game

とりあえずDPっぽいものから考えた。カード11から順にカードNNまで二人に配っていくとして、千咲さんにxx枚、月乃瀬さんにyy枚配った時点で、条件に合っているような配り方の総数をdp[x][y]dp[x][y]とする。遷移としては

(Sx=1(S_x=1かつxy)x\le y)または(Sx=0(S_x = 0かつx>y)x > y)なら

dp[x][y]+=dp[x1][y]dp[x][y] += dp[x-1][y]

(Sy=0(S_y=0かつyx)y \le x)または(Sy=1(S_y = 1かつy>x)y > x)なら

dp[x][y]+=dp[x][y1]dp[x][y] += dp[x][y-1]

で求まるが、O(N2){\mathcal O}(N^2)なので制約的に無理だし、実はメモ化再帰で枝刈りされるみたいなこともないし、うまい高速化も思いつかないし……となって困っていた。

こういう問題の言い換えとして、原点OOからスタートして千咲さんがカードを取ったらベクトル(1,1)(1, 1)に沿って進み、月乃瀬さんが取ったらベクトル(1,1)(1, -1)に沿って進むというのがあったなと思い出して実験してみると、次のような性質が見える:

  • OOからスタートして(2N,0)(2N, 0)に着く
  • yy座標が正の時は月乃瀬さんが勝っていて、yy座標が負の時は千咲さんが勝っている。つまり、文字列SSで勝ち負けが切り替わるところでxx軸と交わる。

すなわち、SS中で00が連続している部分ではxx軸の上にいなければならず(xx軸を踏んでも良い)、11が連続している部分では下にいなければならない。このパスの数え上げは有名なのがあった気がすると思ってググったらカタラン数だった。同じ要素が連続している各部分列についてカタラン数を求めてかけ合わせれば答えになっている。

2019年10月12日土曜日

JOI2014 予選 F - 財宝

JOI2014 予選 F - 財宝

ある財宝の取り方について、Annaの取った財宝の市場価値の総和をxAx_A、BrunoのそれをxBx_Bとし、貴重度の総和も同様にyA,yBy_A, y_Bとする。xAx_AxBx_Bの差を一定以内におさめつつ、yAy_AyBy_Bの差を最大化する問題である。

総当たりすると間に合わないので、財宝の集合SSを半分にわけてS1S_1S2S_2とする。SSからの財宝の取り方は3S3^{|S|}通りあるので、財宝の取り方全体の集合を3S3^Sのように書くことにする。

ある取り方t3S1t \in 3^{S_1}について、二人の取り分の市場価値の差(Anna - Bruno)をΔx\Delta xとし、貴重度の差をΔy\Delta yとする。この時、S2S_2からの財宝のある取り方が有効であるのは、その市場価値の差が[DΔx,DΔx][-D -\Delta x, D - \Delta x]に入っている場合であり、その条件下で貴重度の差は大きければ大きいほどよい。したがって、3S23^{S_2}を市場価値の差の昇順でソートしておけば、区間[DΔx,DΔx][-D -\Delta x, D - \Delta x]に関して貴重度の差の最大値を求める問題になる。これは平衡二分木で処理できるし、スライド最大値でもできる。ソートが律速で計算量はO(3N/2N){\mathcal O}(3^{N/2}N)


3151.4×1073^{15} \simeq 1.4 \times 10^7のソートが想定解の問題を初めて見た……

2019年10月8日火曜日

ARC 059 E - キャンディーとN人の子供

ARC 059 E - キャンディーとN人の子供

部分点のケースについて考える。xix_iが一定の場合、
g(k,y):=a1+...+aN=yi=1kxiaig(k, y) := \sum_{a_1 + ... + a_N = y} \prod_{i=1}^k x_i^{a_i}

とすると答えはg(N,C)g(N, C)で、漸化式は

g(k,y)=g(k1,y)+xkg(k1,y1)+...+xkyg(k1,0)g(k, y) = g(k-1, y) + x_k g(k-1, y-1) + ... + x_k^y g(k-1, 0)

g(0,0)=1g(0, 0) = 1

g(0,y)=0(y0)g(0, y) = 0 \qquad (y \neq 0)

と書ける。DPすれば計算量はO(NC2){\mathcal O}(NC^2)

元の制約についてもだいたい同じように解ける。

h(k,y):=x1=A1B1x2=A2B2...xN=ANBNa1+...+aN=yi=1kxiaih(k, y) := \sum_{x_1 = A_1}^{B_1} \sum_{x_2 = A_2}^{B_2} ... \sum_{x_N = A_N}^{B_N} \sum_{a_1 + ... + a_N = y} \prod_{i=1}^k x_i^{a_i}

とするとやはり答えはh(N,C)h(N, C)で、

h(k,y):=a1+...+aN=yx1=A1B1x2=A2B2...xN=ANBNi=1kxiai:=a1+...+aN=y(x1=A1B1x1a1)(x2=A2B2x2a2)...(xN=ANBNxNaN)\begin{aligned} h(k, y) & := \sum_{a_1 + ... + a_N = y} \sum_{x_1 = A_1}^{B_1} \sum_{x_2 = A_2}^{B_2} ... \sum_{x_N = A_N}^{B_N} \prod_{i=1}^k x_i^{a_i} \\ & := \sum_{a_1 + ... + a_N = y} \Bigl( \sum_{x_1 = A_1}^{B_1} x_1^{a_1} \Bigr) \Bigl( \sum_{x_2 = A_2}^{B_2}x_2^{a_2} \Bigr) ... \Bigl( \sum_{x_N = A_N}^{B_N}x_N^{a_N} \Bigr) \end{aligned}

だから、漸化式は

h(k,y)=h(k1,y)+(xk=AkBkxk)h(k1,y1)+...+(xk=AkBkxky)h(k1,0)h(k, y) = h(k-1, y) + \Bigl( \sum_{x_k = A_k}^{B_k} x_k \Bigr) h(k-1, y-1) + ... + \Bigl( \sum_{x_k = A_k}^{B_k} x_k^y \Bigr) h(k-1, 0)

となって、やはりDPすれば計算量はO(NC2){\mathcal O}(NC^2)