ARC176 python Atcoderの記録

問題はこちら


A

N, M = list(map(int, input().split()))
print(N*M) # 1の個数はN*M個
"""
考え方
M=1で自由に1を置けるとき:対角線すべてのマスに1を置くのが最もシンプル。
M=1で置く場所を決められたとき:そのマスから対角線と平行なマスに1を置くのが最もシンプル。
M=M'で置く場所を決められたとき:そのマスから対角線と平行なマスに1を置くことをM回行う。マスが重複した場合、自由に選んでいい感じに1を置く。

実装
1を置くマスごとに、斜めのマスを出力する。
1を置いた斜めのラインを管理しておき、重複した数に応じて、まだ1を置いていない斜めのラインに1を置く。
斜めラインの命名は1列目のマスで何行目に1を置くかで行う。(対角線は1、対角線の下のラインだと2, ... N)
"""
diagonal_lines = set()
# 指定されたマスを通る斜めラインの出力
for m in range(M):
    A,B= list(map(int, input().split()))
    diagonal_line = (A-B+1)%N
    if diagonal_line == 0:
        diagonal_line = N
    if diagonal_line in diagonal_lines: # 既に出力済みであれば、次のマスの操作へ。
        continue
    diagonal_lines.add(diagonal_line)
    for i in range(N):
        if (diagonal_line + i)%N == 0:
            temp = N
        else:
            temp = (diagonal_line + i)%N
        print(temp, 1 + i)
# 不足分の斜めラインの出力
counter = M - len(diagonal_lines)
for s in range(1,N+1):
    if counter == 0: # 斜めラインをM個出力していればBreak
        break
    if s in diagonal_lines: # 既に出力済みであれば、次のマスの操作へ。
        continue
    diagonal_lines.add(s)
    counter  -= 1
    for i in range(N):
        if (s + i)%N == 0:
            temp = N
        else:
            temp = (s + i)%N
        print(temp, 1 + i)
    


B
N>Mばかり考えており時間切れ





C





D





E





F