A - Rotate
Python が楽.
S = input() print(S[1:] + S[0])
B - Visibility
を中心にして,4 方向それぞれに対して壁にぶつかるまで進む. を重複してカウントしないように注意.
あんまりきれいに実装できなかった.
H, W, X, Y = map(int, input().split()) X -= 1 Y -= 1 S = [] for _ in range(H): S.append(input()) ans = 1 for j in range(Y + 1, W): if S[X][j] == '#': break ans += 1 for j in reversed(range(Y)): if S[X][j] == '#': break ans += 1 for i in range(X + 1, H): if S[i][Y] == '#': break ans += 1 for i in reversed(range(X)): if S[i][Y] == '#': break ans += 1 print(ans)
C - ORXOR
数列の各項の隙間 個に対して,それぞれ切る or 切らないの 全探索.区間列挙の際は両端に番兵を入れておくとよい.
N = int(input()) A = list(map(int, input().split())) ans = 1 << 32 for i in range(1 << N - 1): sep = [0] + [j + 1 for j in range(N - 1) if i >> j & 1] + [N] K = len(sep) - 1 x = 0 for l, r in zip(sep, sep[1:]): v = 0 for t in A[l:r]: v |= t x ^= v ans = min(ans, x) print(ans)
D - Opposite
点の回転がしたいので複素数を使う.
とおく.正 角形の中心を とすると, である.そして, を用いて目標の点 は次のように表せる.
実装においては,Python では標準で complex
型がサポートされているのでこれを使うとよい.
import math N = int(input()) K = N // 2 x0, y0 = map(int, input().split()) xK, yK = map(int, input().split()) z0 = complex(x0, y0) zM = complex((x0 + xK) / 2, (y0 + yK) / 2) rot = complex(math.cos(math.pi / K), math.sin(math.pi / K)) z1 = (z0 - zM) * rot + zM print(z1.real, z1.imag)
E - Traveler
DP をやるだけなんだけど,何を思ったか貪欲方針があると思って時間を溶かした.なんで...?
ボールが一つ以上存在するような全ての色に対して,その昇順に番号を と振りなおす.そして,各色の玉の左端の位置 と右端の位置 を計算しておく.
ここで,以降の実装の簡単のため,色 をスタート地点に対応させ,色 をゴール地点に対応させる.このとき, である.
2 つの DP テーブル および を,それぞれ以下のように定義する.
まず, の場合は明らかに である.
の場合は,次のように遷移を書くことが出来る.
求める答えは または である.
F - Construct a Palindrome
難しい,みんな解くのが速い...
回文の中心から外に向かってパスを伸ばしていくイメージで,次のテーブルを埋めていく.
初め,すべての に対して と初期化しておく.
自明なケースとして である.また, である ( の場合は最短長は であるため除く必要がある).
以上を基底ケースとして,テーブルの残りの部分を幅優先探索により埋めることができる.
具体的な手続きを以下に示す.なお,以降は幅優先探索に用いるキューを ,頂点 を始点とする辺の集合を と表すことにする.また, を始点, を終点とする文字 が書かれた辺を と三つ組にして表現する.
- 基底ケースの頂点組 を に push する.
- が空なら,全ての を確定済みとして終了する.空でないなら,3 に進む.
- の先頭要素 を pop する *1. の組を全探索する.このとき,各 に対して,次のような場合分けを行う.全探索を終えたら,2 へ戻る.
- のとき:
何もしない - かつ が未確定のとき:
確定し *2, に を push する. - かつ が確定済みのとき:
何もしない
- のとき:
さて,この手続きにおける遷移の数が膨大になりそうだが,実は となっている.これは,各頂点組 に対して接続する辺を全探索を行うのは一回きりであり,遷移の数は次のように計算できることから従う.
問題の答えとしては, または の値を参照すればよい.( なら -1
を出力)