裏紙

ほぼ競プロ、たまに日記

BAPC 2018 D - Driver Disagreement

問題

Dashboard - 2018 Benelux Algorithm Programming Contest (BAPC 18) - Codeforces

問題概要

n個の交差点がある。交差点iは道が二手に分かれており、左に行くと交差点l_iに、右に行くと交差点r_iに辿り着くことが分かっている。また、交差点iからピサの斜塔が見える時はt_i = 1、見えない時はt_i = 0という情報がある。

今、自分が交差点ABのどちらかにいることが分かっている。そこから左右の選択を適切にすることによって、ピサの斜塔が見えるかどうかの情報から最初に自分がABのどちらにいたのかを特定することは可能か。不可能ならばindistinguishableと答え、可能ならば最短の操作回数を答えよ。

  •  2 \le n \le 10^5
  •  0 \le A,B \le n-1 , A \neq B
  •  0 \le l_i , r_i \le n-1
  •  t_i = 0, 1

イデア

一番素直な方法として思いつくのが今いる位置のペアを管理しながらBFSをするというものだが、これは状態がO(n^2)個あるので、TLEしてしまう。 簡単のために、まずindistinguishableなのかどうかだけを考えてみる。

以下では、問題をグラフとして置き換え、ピサの斜塔が見える頂点を黒、見えない頂点を白と呼ぶことにする。

頂点xyindistinguishableであることの意味について考えてみると、どのように移動してもそのペアの頂点の色は等しいということになる。 つまり、仮想的には同じ頂点にいると考えてしまってもいいと言える。

今、xyindistinguishable、かつyzindistinguishableであるということが分かっているとすると、xzの関係に注目したとき、直感的にはわざわざチェックするまでもなくindistinguishableなのでは?と思える。

実際にこれは正しい。 xzindistinguishableではないとすると、ある操作(例えば、LLRLRみたいな)によって、xの方は黒、zの方は白の頂点にいるという状況が発生しうる。 しかし、上の2つの仮定から、yは黒でもあり白でもあるということになってしまうが、これはあり得ない。

この同値関係が成り立つことを利用して、BFSの状態を減らすことを考える。 以下のBFSではindistinguishableでないペアが見つかり次第ストップするということを前提とする。 「既に2つの状態:(x,y)(y,z) をチェック済みである場合は(x,z)indistinguishableであるとしてそれ以降はチェックしない」というBFSを行う。

これはちゃんと機能するBFSとなる。 もし、本当にx,y,zindistinguishableなのであればやっていることは正しいし、 (x,z)が本当は区別可能だったとすると、BFSが(x,y)(y,z)の両方をパスしてしまっていることに反してしまうからである。

このような状態を効率よく管理するためには、UnionFindなどのデータ構造を使えば良い。 この状態のマージによって、BFS内で訪れる状態はO(n)個となり、十分に速い。 元の問題に戻ると、区別可能な時は最短の回数が必要になるので、BFS内で同時に回数も管理する。

実装(C++)

続きを読む

ACM-ICPC 2018 Asia Yokohama Regional Contest に参加しました

2018年12月8,9日に横浜でACM-ICPC 2018 Asia Yokohama Regional ContestにWAsedACというチームで参加しました。

メンバーはimulan(私)、ryoissy、yamadで結果は60チーム中10位でした。

早めに書こうとは思っていたのですが、結局遅くなってしまいました。簡潔に参加の感想を書きます。

1日目

お昼ごろからregistrationだったが、その前にコーチと4人で、registrationの前に中華街でご飯を食べた。この日はリハーサルとチーム紹介をした。

リハーサルでは__int128が使えるかとか、sampleをwgetで一気にダウンロードして遊んだりしてたら「正解が無いけど大丈夫ですか」的な感じでスタッフの方が来てすいませんってなった。

夜は近くのビジネスホテルに泊まった。ダブルの部屋に2人で泊まったんだけど、ダブルベッドに2人で寝るのはあまりおすすめできません。

2日目

この日はコンテストだった。コンテストの感想を細かく書く気力はないけど、自分の感想を簡単にまとめると

  • 傾向変わりつつあるかと思いきや、なんだかんだ実装量は多かった(めちゃくちゃ問題文長い、みたいなのがないので幸せ
  • 序盤悪すぎる(ペナルティが物語っている(+も多いし
  • PCの前に座ってから手が止まるシーンがあった(もうちょっと細かいところを詰めておくべき

疲れてて懇親会はあんまり交流できなかった...

3日目の企業見学も(完全に交流が目的になるが)余裕があれば行きたかったけど、行きたい気持ちを抑えて学校に行きました(できれば卒業したいので)。

おわりに

去年に続き、早稲田からは2チームがアジアに進みました。その6人のうち4人は今年で引退となりますが、来年以降もアジア予選に進むチームが複数出てほしいですね。ICPCがあることでなんだかんだモチベを保ってきた自分からしても、アジア予選に進めることは良い経験になりました。来年はそんなチームに多くの風船を配りに行けたらいいなと思います。