結果

問題 No.1306 Exactly 2 Digits
ユーザー tamato
提出日時 2020-12-30 23:32:15
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 3,410 bytes
コンパイル時間 179 ms
コンパイル使用メモリ 82,424 KB
実行使用メモリ 95,440 KB
平均クエリ数 1032.47
最終ジャッジ日時 2024-07-17 10:21:00
合計ジャッジ時間 38,828 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 4 WA * 24 RE * 95
権限があれば一括ダウンロードができます

ソースコード

diff #

mod = 1000000007
eps = 10**-9


def main():
    import sys
    input = sys.stdin.readline

    def ask(i, j):
        print("?", i, j)
        sys.stdout.flush()

    N = int(input())
    info = []
    S = []
    for j in range(2, N**2 - N + 1):
        ask(1, j)
        p, q = map(int, input().split())
        info.append((p, q))
        S.append(p+q)

    ans = [-1] * (N**2 - N)
    ma = max(S)
    if ma < 0:
        ans[0] = N
        mi = min(S)
        for j, s in enumerate(S):
            if s == mi:
                ans[j+1] = N**2 - 1
                jj = j+2
                break
        seen = [None] * (2 * N + 5)
        for j, s in enumerate(S):
            if j == jj-2:
                continue
            if seen[s] is not None:
                ans[j+1] = seen[s]
            else:
                p, q = info[j]
                cand = []
                a, b = -p+1, -q
                if 0 <= a < N and 1 <= b < N:
                    cand.append((a, b))
                a, b = -q+1, -p
                if 0 <= a < N and 1 <= b < N:
                    cand.append((a, b))
                if len(cand) == 1:
                    ans[j+1] = a * N + b
                else:
                    ask(jj, j+2)
                    p_new, q_new = map(int, input().split())
                    p1, q1 = sorted([N-1 - cand[0][0], N-1 - cand[0][1]])
                    if p1 == p_new and q1 == q_new:
                        ans[j+1] = cand[0][0] * N + cand[0][1]
                        seen[s] = cand[1][0] * N + cand[1][1]
                    else:
                        ans[j + 1] = cand[1][0] * N + cand[1][1]
                        seen[s] = cand[0][0] * N + cand[0][1]
    else:
        mi = min(S)
        for j, s in enumerate(S):
            if s == ma:
                j_ma = j
            elif s == mi:
                j_mi = j
        ans[j_mi + 1] = N**2 - 1
        ans[j_ma + 1] = N
        a, b = info[j_mi]
        x, y = a + N - 1, b + N - 1
        c, d = info[j_ma]
        if c == x-1 and d == y:
            ans[0] = x * N + y
            K = ans[0]
        else:
            ans[0] = y * N + x
            K = ans[0]
            x, y = y, x

        seen = [None] * (4 * N + 5)
        for j, s in enumerate(S):
            if j == j_mi or j == j_ma:
                continue
            if seen[s] is not None:
                ans[j + 1] = seen[s]
            else:
                p, q = info[j]
                cand = []
                a, b = -p + x, -q + y
                if 0 <= a < N and 1 <= b < N:
                    cand.append((a, b))
                a, b = -q + x, -p + y
                if 0 <= a < N and 1 <= b < N:
                    cand.append((a, b))
                if len(cand) == 1:
                    ans[j + 1] = a * N + b
                else:
                    ask(j_ma, j+2)
                    p_new, q_new = map(int, input().split())
                    p1, q1 = sorted([1 - cand[0][0], -cand[0][1]])
                    if p1 == p_new and q1 == q_new:
                        ans[j + 1] = cand[0][0] * N + cand[0][1]
                        seen[s] = cand[1][0] * N + cand[1][1]
                    else:
                        ans[j + 1] = cand[1][0] * N + cand[1][1]
                        seen[s] = cand[0][0] * N + cand[0][1]
    ans = ["!"] + ans
    print(*ans)
    sys.stdout.flush()


if __name__ == '__main__':
    main()
0