aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

agc 013 C - Ants on a Circle (python)

diff が一つ上がるごとに発想が一つ増える感じがする。
緑なら一つ、青diff なら二つといったイメージ
今回の問題は橙diff で実験から3つのことが分かるかどうかみたいな問題だった。

1. ボール i が衝突を考慮しないで t 秒たったときの位置には 1 ~ n までのボールのいずれかが存在する。(衝突時に2つのボールの向きが変わるが速さは同じということは、衝突時にボールの番号が入れ替わっただけと考えても同じだから)

2. ボール 1 からの並び順は、時計回りにみれば常に 1, 2, 3,...,n になっている(ボール i はボール i-1 とボール i+1 の間しか動けない)

3. 最も座標の小さいボールの番号は、スタート時が 1 であり、そこから位置0を時計回りに通過するボールが現れたら -1 し、反時計回りに通過するボールが現れたら +1 する(ただし、ボールの番号が0以下になったらnを足す)

1,2 から t 秒後に座標(位置)の最も小さいボールの番号 s が分かれば 1 ~ n のボールの座標が座標の小さい順に s, s+1, ..., n, 1, 2, ... のように決まり、3 から座標の最も小さいボールの番号 s が分かるので解ける。

n,l,t = map(int,input().split())
c = []
s = 0
for i in range(n):
  x,w = map(int,input().split())
  if w == 1:
    c.append((x+t)%l)
    s += (x+t)//l
  else:
    c.append((x-t)%l)
    s += (x-t)//l
    
c.sort()
s %= n
c = c[s:] + c[:s]
print(*[i for i in c], sep='\n')