ARC224-- 参加記

私です。

ARC224— に参加しました。A, B, C, Eの4完です。

初めてのARC Ratedをしっかり勝てて気持ちがいいです。


A問題 Attach 00

K×100K \times 100 は必ず末尾に 0000 を持ちます。ということは、K,2K,,100KK, 2K, \ldots, 100K を順に見て、十進表記に 0000 を含む最初のものを出せばよいです。

1ケースにつき高々100個の倍数を調べればよく、それぞれの桁数は最大12桁です。したがって、T105T \leq 10^5 より計算量はおよそ

12×100×105=1.2×10812 \times 100 \times 10^5 = 1.2 \times 10^8

となります。文字列にして contains("00") するだけで十分間に合います。


B問題 Adjacent Tiles

X×YX \times Y の長方形に並べたとき、完全に共有する辺の数は

X(Y1)+Y(X1)X(Y-1)+Y(X-1)

です。

一辺が nn の正方形なら、共有する辺の数は

2n(n1)2n(n-1)

本です。これは nn について単調増加するので、まず作れる最大の正方形を作るのが良さそうです。

そこで、

s=Ns=\lfloor\sqrt{N}\rfloor

とします。次に、正方形からそのまま一辺を伸ばすことを考えます。

q=Nsq=\left\lfloor\frac{N}{s}\right\rfloor

とすると、まず s×qs \times q の長方形を作れます。この長方形が持つ共有辺の数は

s(q1)+q(s1)s(q-1)+q(s-1)

本です。

残っているタイルの枚数を

r=Nsqr=N-sq

とします。r>0r>0 の場合は、長方形の横にタイルを一列追加します。

最初の1枚は長方形と1辺を共有し、以降の1枚は長方形と直前のタイルに接するので、r>0r>0 のとき増える辺の数は 2r12r-1 本です。これを長方形の式に足せば答えになります。

つまり、答えは

s(q1)+q(s1)+{0(r=0)2r1(r>0)s(q-1)+q(s-1)+ \begin{cases} 0 & (r=0) \\ 2r-1 & (r>0) \end{cases}

です。


C問題 Ascending Labels

最初はBFSだと思って実装を投げましたが、嘘解法でした。普通に条件を言い換えたらDFSだなぁとなりました。

BFSの距離を AvA_v にすると、距離が1小さい隣接頂点が複数存在する場合があります。問題では Aw=Av1A_w=A_v-1 を満たす隣接頂点がちょうど1つでなければならないため、これでは条件を満たしません。

そこで、頂点1を根としてDFS木を作り、各頂点のDFS木上の深さを AvA_v にします。

頂点 vv の親は深さがちょうど1小さいため、Aw=Av1A_w=A_v-1 を満たします。また、無向グラフのDFSにおいて、DFS木に含まれない辺は祖先と子孫を結ぶ辺になります。

vv より深さがちょうど1小さい祖先は vv の親しか存在しません。したがって、Aw=Av1A_w=A_v-1 を満たす隣接頂点もちょうど1つになります。

よって、ただDFSを実装するだけでよいです。


D問題 Angst for All Pairs

本当に意味がわからないです。日本語の意味がわかりませんでした。


E問題 ABC|AB|A

D問題の読解にずっと固執していましたが、ふとEを見ると簡単すぎて悲しくなりました。最初からこっちを見ておけば……。

文字列を後ろから読み、BC をスタックに積みます。A を読んだときは、次の順番で削除します。

  • スタックの一番上が B、その下が C なら、完成した ABC を削除する
  • ABC にはならないが、一番上が B なら AB を削除する
  • どちらでもなければ A を単独で削除する

これで、削除しきれず残った BC の数が答えです。


最後に

ARCはABCに比べて、問題に対する考察の比重が多めなので割と好きです。

では、また。