WUPC2020参加記

WUPC2020に、つるさん(@oinori1197)とチーム名「sleep_and_beer」で参加しました。お互いに初めてのチーム戦で不安もありましたが、結果としてすごく楽しめました。ここに記録を残します。

事前準備

  • お互いの得意苦手を考慮して優先担当を決めておく。
     つるさん:フロー、数え上げ、数学
     私:ゲーム
  • 使用言語が異なるためコーディング方針は各自に任せる。
  • コンテスト開始直後は私がA問題、つるさんがB問題を考える。
  • 順位表で既に解かれている問題を中心に考える。

コンテスト開始

序盤1(ここまで0完)

私がA問題を、つるさんがB問題を考える。

A問題:場合分けで焦った。緊張で手汗がすごかった。AC(私 00:06)

B問題:構築問題だったようで、つるさんから相談を受ける。

つるさん「(問題の概要を説明)」

「n が偶数のとき、B_i、B_(i + 1) を適当に決めると A_i * B_i + A_(i + 1) * B_(i + 1) = 0 にできますね」

つるさん「確かに…!!」

私「でも n が奇数のときはどうするんでしょう…」

つるさん「奇数のときは (省略*1)するとうまくできますね」

私「確かに…!!」

みたいな話をして、無事AC(つるさん 00:22)

序盤2(ここまで2完)

私がC問題を、つるさんがF問題を考える。 

C問題:題意を理解したところで、解法が全く見えない。つるさんに相談。

私「(問題の概要を説明)」

つるさん「最大値を求める問題なのに、MOD = 10 ** 9 + 7 を取るんですね」

私「たしかに…なんでだろう…」

落ち着いて考えると、二項係数で重みを考慮した総和を考えると良いことに気づく。「だから、MODを取る設定だったのねー」と合点。サンプルがあったので提出。 AC(私 00:35)

F問題:つるさんがサクッと通してくれた。ありがてえ。AC(つるさん 00:48)

中盤1(ここまで4完)

順位表から、M問題が解かれてたので見る。 

私「これ全方位木DPにしか見えないんですがどうですか…?」

つるさん「全方位木DPですね…」

実装の担当をつるさんに押し付けお願いしました。AC(つるさん 01:23)

つるさんがM問題を実装している間に、G問題を考える。

  • ナップサックで前計算した後に、DPすれば解けるのでは…?
  • dp[休憩をした回数][現在の時刻]で最大筋力を計算できる? → 一回の遷移にO(T)かかりそうなので、合計O(T^3)で厳しい。
  • DP[最後に休憩した時刻][現在時刻]で最大筋力を計算すると、合計O(T^2)でいけそう...?

つるさんがM問題を通した後、実装に取り掛かるが遷移が破滅。つるさんに助けを求める。

 私「G、なんかバグります…」

 私「何もしてないのに遷移が壊れました…」

 私「自分が書いたコードをうまく説明できません…」 

みたいな話をしてしまって、かなり落ち込む。つるさんに話を聞いてもらうことで冷静にれたのか、個数制限なしナップサックで解けることに気づく。何とかAC(私 02:08)

中盤2(ここまで6完)

つるさんがE問題を、私がJ問題を考える。

E問題:サンプルがなかなか合わず苦戦してた模様。コンテスト終了後に聞いたところ、包除のあれこれでバグってたようでした(包除バグらせがち、分かる)。無事AC(つるさん 03:26)

J問題:SCCして逆辺を貼ってDFSすれば行けるのでは?実装もそんなに難しくなさそう。

K問題:こういうのはまねっこ戦略なんですよね〜 → まねっこ戦略じゃん!

つるさんから、コーディングを譲ってもらって実装。KとJをAC(02:36, 02:53)。コンテスト前に相談していたように、ゲームを担当して解けたので安心しました。

残り1時間30分 (ここまで9完)

この時点で、I問題を30人ほど解いてたので解きたい。つるさんが残りの問題をざっと見たところ、L問題の考察を進められそうとのことで、

  • I問題:私
  • L問題:つるさん

で分担。つるさんが机上でカリカリと考察を進める間、I問題の目処が立ったので、実験コードを書きながら実装。

  • サンプルが合ったので提出(04:10) → TLE
  • 計算量を見直して提出(04:33) → RE
  • バグを発見したので修正して提出(04:37) → WA
  • バグを発見したので修正して提出(04:44) → WA

消えたい…

残り15分(ここまで9完)

L問題に関して、つるさんから相談を受ける。

つるさん「三項間漸化式に落とせたんですが、どうしたらいいのか悩んでて…」

私「行列累乗ですかね?」

つるさん「累乗和として求める方法が分からないんですよね」

私「あー、ABCか蟻本で見たことあるような…(蟻本P184に累乗和の話があることを発見する)」

つるさん「これっぽいです、実装してみます!」

つるさん、L問題をコーディングする。私、I問題のバグを目視で探す。 

残り3分(ここまで9完)

ん?これを

f:id:neterukun_cd:20200913190719p:plain

こうすると…?

f:id:neterukun_cd:20200913190721p:plain

 I問題、AC(04:58)!! 

f:id:neterukun_cd:20200913190830p:plain

バグらせすぎなんだよなぁ...

残り0分

ABCEFGIJKMの10完、全体35位でした。わいわい

f:id:neterukun_cd:20200913190840p:plain

残り−10分

つるさんがL問題をAC!!「流石やでぇ…!!」となりました。本当に惜しかった…

 

感想など

  • チーム戦、楽しい!!!!!!!!!!!!!!
  • 得意不得意をお互いに補えたので良かった。私が取っ掛かりすら掴めなさそうなE問題、L問題を相方が解き進めているという安心感。私は私で、K問題やちょっとした相談などで役割を果たせて良かった。
  • 5時間、意外と集中できる。持て余す時間はなかった。
  • 使用言語が違ってもなんとかなった。ただ、言語が一緒だとお互いのバグ取りなどスムーズにいってた可能性はありそう。
  • コンテスト全体のうち、あと10分ほど時間を捻出できたらL問題通ってたよなぁ。バグを減らすのもそうなんですが、慣れや進め方でも時短できそう。チーム戦面白い。

おわりに

つるさん、チーム一緒に組めて楽しかったです、ありがとうございました。運営の皆さん、面白い問題揃いでまたとない5時間でした、ありがとうございました。 

*1:x * b_0 + y * b_1 + z * b_2 について、b_0 = -z, b_1 = -z, b_2 = x + y とすると良いです