結果

問題 No.3740 Troublesome Congestion
コンテスト
ユーザー 👑 kencho
提出日時 2026-08-12 15:01:22
言語 Python3
(3.14.7 + numpy 2.5.2 + scipy 1.18.0 + ACL)
コンパイル:
python3 -mpy_compile _filename_
実行:
python3 _filename_
結果
WA  
実行時間 -
コード長 2,436 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 56 ms
コンパイル使用メモリ 15,360 KB
実行使用メモリ 11,904 KB
最終ジャッジ日時 2026-09-19 12:38:27
合計ジャッジ時間 2,830 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_1
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
部分点1 20 % AC * 7
部分点2 30 % AC * 12
満点 50 % AC * 12 WA * 14
合計 4 * 50% = 200 点
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys

N = 40
WIDTH = 4


def put(a, r, c):
    if 0 <= r < N and 0 <= c < N:
        a[r][c] = "."


def connect(a, cells, upper):
    if not cells:
        return
    cells.sort()
    r, c = cells[0]
    for nr, nc in cells[1:]:
        if upper:
            for x in range(c, nc + 1): put(a, r, x)
            for y in range(r, nr + 1): put(a, y, nc)
        else:
            for y in range(r, nr + 1): put(a, y, c)
            for x in range(c, nc + 1): put(a, nr, x)
        r, c = nr, nc
    if upper:
        for x in range(c, N): put(a, r, x)
        for y in range(r, N): put(a, y, N - 1)
    else:
        for y in range(r, N): put(a, y, c)
        for x in range(c, N): put(a, N - 1, x)


def build(m):
    a = [["#"] * N for _ in range(N)]
    low, high = -(WIDTH // 2 - 1), WIDTH // 2
    for r in range(N):
        for c in range(N):
            if low <= r - c <= high:
                a[r][c] = "."

    switches, exits = [], []
    for r in range(N):
        c = r - low
        if c + 2 < N:
            switches.append((r, c + 1))
            exits.append((r, c + 2))
    for c in range(N):
        r = c + high
        if r + 2 < N:
            switches.append((r + 1, c))
            exits.append((r + 2, c))

    for r in range(N):
        for c in range(N):
            if r + c >= 2 * N - 7 and a[r][c] == ".":
                a[r][c] = "#"

    dp = [[0] * N for _ in range(N)]
    dp[0][0] = 1
    for r in range(N):
        for c in range(N):
            if (r or c) and a[r][c] == ".":
                dp[r][c] = (dp[r - 1][c] if r else 0) + (dp[r][c - 1] if c else 0)

    values = [(dp[r - 1][c] if r else 0) + (dp[r][c - 1] if c else 0)
              for r, c in switches]
    chosen = []
    for i in sorted(range(len(values)), key=lambda i: values[i], reverse=True):
        if 0 < values[i] <= m:
            m -= values[i]
            chosen.append(i)
    if m:
        return None

    upper, lower = [], []
    for i in chosen:
        r, c = switches[i]
        a[r][c] = "P"
        put(a, *exits[i])
        (upper if exits[i][0] < exits[i][1] else lower).append(exits[i])
    connect(a, upper, True)
    connect(a, lower, False)
    a[0][0] = a[-1][-1] = "."
    return a


data = list(map(int, sys.stdin.buffer.read().split()))
answer = []
for m in data[1:]:
    grid = build(m)
    answer += ["-1"] if grid is None else [str(N)] + ["".join(row) for row in grid]
print("\n".join(answer))
0