ABC136 D - Gathering Children
備忘録
問題
回答
import sys import os import math import bisect import itertools import collections import heapq import queue import array import time # 時々使う # from scipy.sparse.csgraph import csgraph_from_dense, floyd_warshall # from decimal import Decimal # from collections import defaultdict, deque # 再帰の制限設定 sys.setrecursionlimit(10000000) def ii(): return int(sys.stdin.buffer.readline().rstrip()) def il(): return list(map(int, sys.stdin.buffer.readline().split())) def fl(): return list(map(float, sys.stdin.buffer.readline().split())) def iln(n): return [int(sys.stdin.buffer.readline().rstrip()) for _ in range(n)] def iss(): return sys.stdin.buffer.readline().decode().rstrip() def sl(): return list(map(str, sys.stdin.buffer.readline().decode().split())) def isn(n): return [sys.stdin.buffer.readline().decode().rstrip() for _ in range(n)] def lcm(x, y): return (x * y) // math.gcd(x, y) MOD = 10 ** 9 + 7 INF = float('inf') def main(): if os.getenv("LOCAL"): sys.stdin = open("input.txt", "r") S = iss() N = len(S) ret = [0] * N for i in range(N-1): if S[i] == 'R' and S[i+1] == 'L': # 'RL'の'R'と'L'の移動後の位置は # 元の場所に戻る ret[i] += 1 ret[i+1] += 1 for j in reversed(range(0, i)): # 'RL'の'R'よりも左に存在する'R'を探索する if S[j] == 'R': # 左に存在する'R'の位置が奇数個離れている場合には i(Rの位置) + 1に移動する # 左に存在する'R'の位置が偶数個離れている場合には i(Rの位置)に移動する ret[i + (i-j) % 2] += 1 else: break for j in range(i+2, N): # 'RL'の'L'よりも右に存在する'L'を探索する if S[j] == 'L': # 右に存在する'L'の位置が偶数個離れている場合には i+1(Lの位置) - 1に移動する # 右に存在する'L'の位置が奇数個離れている場合には i+1(Lの位置)に移動する ret[(i+1)-((j-i+1) % 2)] += 1 else: break print(*ret) if __name__ == '__main__': main()
考え方
RとLが存在する位置の偶奇から移動後に到着する位置を求めます。
- 回答概要
- 全ての
R
およびL
はRL
が並んだ位置に集まる R
とL
の位置の偶奇で10 ** 100
回移動した後の位置を求める
- 全ての
まず、各R
とL
が移動する位置について考えます。
R
は右に移動し続け、L
が存在する位置で止まるかL
とR
を往復します。
L
は左に移動し続け、R
が存在する位置で止まるかR
とL
を往復します。
つまり、全てのR
とL
はRL
と並んでいる位置に集まることになります。
次に問題文の10 ** 100
回行う移動について考えます。
全ての文字に対して、10 ** 100
回の移動を実際にシミュレートすることは、
不可能であるため、別の方針を考えます。
全てのR
とL
はRL
を往復するため、行う移動回数を2
で割ることで、
余りの有無で最終的な位置を求めることが出来ます。
そのため、RL
までに移動する回数が奇数か偶数かを元に、
10 ** 100
回移動した後の位置を一意に特定することが出来ます。
あとはRL
の位置とRL
より左に存在するR
と右に存在するL
の位置関係を間違えずに計算を行うことで
全ての文字に対して移動後の位置を求めることが出来ます。