トップページ -> AOJの解答例 -> ITP2_1の解答例

ITP2_1の解答例(Python)

配列に関する計算量に関して頭に入れた上でコードを書かないと時間制限に引っかかります. こちらのサイトに計算量がまとめてあります.

1. ITP2_1_A: Vector

可変長の配列に対して入力されたクエリに対応する操作を行います.

# ITP2_1A
n = int(input())

A = []
for _ in range(n):
    query = list(map(int,input().split(" ")))
    
    # 末尾の要素の削除
    if query[0] == 2:
        A.pop()
    # 末尾に挿入
    elif query[0] == 0:
        A.append(query[1])
    # query[1]にアクセス
    else:
        print(A[query[1]])

2. ITP2_1_B: Deque

先頭への要素の追加がリストだと時間がかかるので両端へのアクセスの速いdequeを用いました. from collections import deque で deque を使うことができます.
【外部サイト】Pythonのdequeでキュー、スタック、デック(両端キュー)を扱う

# ITP2_1B 
# リストだと時間が間に合わないので両端へのアクセスの速いdequeを用いる
from collections import deque
n = int(input())

A = deque()
for _ in range(n):
    query = list(map(int,input().split(" ")))
    
    # 要素の追加
    if query[0] == 0:
        # 先頭
        if query[1] == 0:
            A.appendleft(query[2])
        # 末尾
        else:
            A.append(query[2])
    # 要素にアクセス    
    elif query[0] == 1:
        print(A[query[1]])
    # 要素の削除
    else:
        # 先頭の要素を削除
        if query[1] == 0:
            A.popleft()
        # 末尾の要素を削除
        else:
            A.pop()

3. ITP2_1_C: List

素直にlistのinsertやpopなどを使うと時間がかかるので,操作を行いたい要素が配列の端にくるように処理します.

# ITP2_1C 要素の追加がなるべく一番後ろになるようにしたい
from collections import deque
n = int(input())

A = deque() # カーソルの前
B = deque() # カーソルの後ろ カーソルはBの先頭
for _ in range(n):
    query = list(map(int,input().split(" ")))
    
    # 挿入
    if query[0] == 0:
        B.appendleft(query[1])
    # カーソルの移動
    elif query[0] == 1:
        # カーソルが負ならAの後方をBの前方に追加
        if query[1] < 0:
            for _ in range(-query[1]):
                B.appendleft(A.pop())
        # カーソルが正ならBの前方をAの後方に追加
        else:
            for _ in range(query[1]):
                A.append(B.popleft())
    else:
        B.popleft()
        
# リストの内容の列挙
for x in A:
    print(x)
    
for x in B:
    print(x)

4. ITP2_1_D: Vector II

多次元になっただけです.特に工夫をしなくても大丈夫でした.

# ITP2_1D 
m, n = list(map(int,input().split(" ")))

A = [[] for _ in range(m)]
    
for _ in range(n):
    query = list(map(int,input().split(" ")))
    # 末尾に追加
    if query[0] == 0:
        A[query[1]].append(query[2])
    # 表示
    elif query[0] == 1:
        print(*A[query[1]]) # スペース区切りでリストを出力する print(*x)
    # 空にする
    else:
        A[query[1]] = []

【目次に戻る】 次へ進む ->