Official

F - Robot Rotation Editorial by kyopro_friends


奇数回目の操作では必ず \(y\) 軸方向のどちらか、偶数回目の操作では必ず \(x\) 軸方向のどちらかのみに移動することができます。また、回転方向を適切に選ぶことで操作開始直前のロボットの向きによらず、正負どちらの方向に進むこともできます。したがって、偶数回目と奇数回目の操作は独立した \(1\) 次元の問題とみなすことができ、次の問題が解ければ十分です。

「長さ \(K\) の正整数列 \((B_i)\) が与えられる。\(B_i\) の符号をそれぞれ自由に決めて良いとき、和を \(X\) にするためには符号をどのように定めればよいか?」

この問題は半分全列挙により \(O(K 2^{K/2})\) で解けます。まずは符号の決め方を求めることは忘れて、単に判定問題「和を \(X\) にすることができるか?」を考えます。
前半 \(K/2\) 項の符号としてありえるものを全て試し、前半 \(K/2\) 項の和としてありえる値をset \(S\) で持ちます。後半についても同様にset \(T\) で持ちます。
\(S\) の元 \(s\) であって、\(X-s\in T\) であるものが存在することが、答えが Yes であるための必要十分条件です。各\(s\) に対して判定は \(O(\log|T|)\) 時間でできることから、\(O(|S|\log|T|)=O(K2^{K/2})\) 時間で判定問題が解けました。
符号の決め方を答える必要がある場合も同様で、\(S,T\) をsetではなくdictで持ち、和をkey、符号の組み合わせをvalueにすることで解くことができます。

以上によりこの問題は \(O(N2^{N/4})\) で解けました。

posted:
last update: