LoginSignup
1
1

More than 1 year has passed since last update.

ABC 298 備忘録

Last updated at Posted at 2023-04-21

概要

 今回はABC298(2023年4月15日21:00 ~ 22:40)の参加記録について自分の実装と感想を記していこうと思う。

A問題

ポイント

  • ダメな条件に引っかかっていないかどうかについて入力から判断

自分の実装

ABC_298_A.py
N = int(input())

S = input()

good = 0

bad = 0

for i in range(N):
    if S[i] == 'o':
        good += 1
    elif S[i] == 'x':
        bad += 1

if good >= 1 and bad == 0:
    print("Yes")
else:
    print("No")

B問題

ポイント

  • 各インデックスの数字に関して、問題文と同様に回転操作を4回行った時に条件を満たしているかどうかを考える

自分の実装

ABC_298_B.py
N = int(input())

A = list(list(map(int, input().split())) for i in range(N))

B = list(list(map(int, input().split())) for i in range(N))

A_1_tile_count = []

# Aの配列中に1がどのインデックスに存在するかを判定

for i in range(N):
    for j in range(N):
        if A[i][j] == 1:
            A_1_tile_count.append([i, j])


if len(A_1_tile_count) == 0:
    print("Yes")
    exit()
# 回転回数

for i in range(4):
    # 条件を満たしているタイルの個数
    count_same = 0
    # 回転後のAの配列のインデックスがBのそれに一致しているかどうかを確認
    for j in range(len(A_1_tile_count)):
        x, y = A_1_tile_count[j][0], A_1_tile_count[j][1]
        if B[x][y] == 1:
            count_same += 1
        # 条件を満たしている場合は終了
        if count_same == len(A_1_tile_count) and j == len(A_1_tile_count) - 1:
            print("Yes")
            exit()
        # 調査が終わった座標は回転
        A_1_tile_count[j] = [N-1-y, x]
print("No")

C問題

ポイント

  • 2個目、3個目の操作に対応するため、箱に入っている数字はlistで、カードが入っている箱はsetで表示(なぜか後半のテストでWA
  • setについてもsortedで昇順で並び替えることにしたらACできた(2023年5月30日追記)

自分の実装(コンテスト時)

ABC_298_C.py
N = int(input())

Q = int(input())

boxes = [[0] for i in range(N+1)]
box_nums = [set() for i in range(2*10**5 + 1)]

for i in range(Q):
    query = list(map(int, input().split()))
    if query[0] == 1:
        boxes[query[2]].append(query[1])
        box_nums[query[1]].add(query[2])
    elif query[0] == 2:
        print(*sorted(boxes[query[1]])[1:])
    else:
        print(*box_nums[query[1]])

自分の実装(追記)

ABC_298_C.py
N = int(input())

Q = int(input())

boxes = [[] for i in range(N+1)]
box_nums = [set() for i in range(201000)]

for i in range(Q):
    query = list(map(int, input().split()))
    if query[0] == 1:
        boxes[query[2]].append(query[1])
        box_nums[query[1]].add(query[2])
    elif query[0] == 2:
        print(*sorted(boxes[query[1]]))
    else:
        print(*sorted(box_nums[query[1]]))

感想

 流石にC問題すら今回解けないとは思わなかった。他の方のPythonによる解説をもとにして再度挑戦したい。

setは自動で数字の順序が決定するものであると思っていたが、違ったようなので今後気をつけたい(2023年5月30日追記)。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1