ARC007 B - 迷子のCDケース
備忘録
問題
回答
import sys import os import math import bisect import itertools import collections import heapq import queue import array import time import numpy as np from numpy import linalg as LA # 時々使う # import numpy as np # from decimal import Decimal, ROUND_HALF_UP # from scipy.sparse.csgraph import csgraph_from_dense, floyd_warshall # 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 MOD = 998244353 INF = float('inf') def main(): if os.getenv("LOCAL"): sys.stdin = open("input.txt", "r") N, M = il() cd = 0 cd_position = list(range(0, N+1)) cd_position[cd] = -1 for i in range(M): n = ii() if cd_position[n] == -1: continue cd_position[cd] = cd_position[n] cd_position[n] = -1 cd = n for i in range(1, N+1): print(cd_position.index(i)) if __name__ == '__main__': main()
考え方
基本的には問題の指示通り、
「新しくCDを取り出す」->「既に出ているCDを取り出したCDが存在していた位置に格納する」を繰り返します。
この時、保持しておくデータの形式は、
index
の番号をCDの番号として、値を格納されている位置とした配列を用いました。
つまり、index = 0
に3
が入っている場合には0
番目のCDはケース3
に格納されていると考えます。
保持するデータの形式さえ決まれば、計算量は多くないため、
指示通りの操作を愚直にシミュレートするだけです。
ただし、既に外に出ているCDを連続して聞く場合がある点に注意が必要です。
この場合には、CDの移動は行われません。