結果

問題 No.3744 XY Tiling
コンテスト
ユーザー 👑 kencho
提出日時 2026-09-03 04:57:09
言語 Python3
(3.14.7 + numpy 2.5.2 + scipy 1.18.0 + ACL)
コンパイル:
python3 -mpy_compile _filename_
実行:
python3 _filename_
結果
AC  
実行時間 57 ms / 2,000 ms
+ 337µs
コード長 3,135 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 60 ms
コンパイル使用メモリ 15,616 KB
実行使用メモリ 14,336 KB
最終ジャッジ日時 2026-09-19 13:05:37
合計ジャッジ時間 5,294 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
部分点 60 % AC * 19
満点 40 % AC * 60
合計 5 * 100% = 500 点
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys

def transpose(sol):
    colors, color, direction = sol
    h, w = len(color), len(color[0])
    nc = [[0] * h for _ in range(w)]
    nd = [["?"] * h for _ in range(w)]
    conv = {">": "v", "<": "^", "v": ">", "^": "<", "?": "?"}
    for r in range(h):
        for c in range(w): nc[c][r], nd[c][r] = color[r][c], conv[direction[r][c]]
    return colors, nc, nd

def small(h, w):
    colors = w // 2 + 1 if h == 1 else 2 if h == 2 else (w + 3) // 4 + 2 if h == 3 else 3
    if h == 5 and w >= 10: colors = 4
    a, d = [[0] * w for _ in range(h)], [["?"] * w for _ in range(h)]
    def horizontal(r):
        for c in range(0, w, 2): d[r][c], d[r][c + 1] = ">", "<"
    def vertical(r):
        for c in range(w): d[r][c], d[r + 1][c] = "v", "^"
    if h == 1:
        for c in range(w): a[0][c] = (c + 1) // 2
        horizontal(0)
    elif h == 2:
        a[1] = [1] * w; vertical(0)
    elif h == 3:
        a[1] = [1] * w
        for c in range(w): a[2][c] = 1 if c % 4 in (0, 3) else 2 + c // 4
        vertical(0); horizontal(2)
    elif h == 4:
        a[1], a[2], a[3] = [1] * w, [1] * w, [2] * w
        vertical(0); vertical(2)
    elif w in (6, 8):
        rows = ["122223", "121123", "122123", "111123", "222223"] if w == 6 else ["12222223", "12111123", "12211223", "11111123", "22222223"]
        a = [[int(x) - 1 for x in row] for row in rows]
        horizontal(0)
        for c in range(2, w - 2): d[0][c], d[1][c] = "v", "^"
        d[1][0], d[1][1], d[1][-2], d[1][-1] = ">", "<", ">", "<"
        horizontal(2)
        for c in range(w - 2): d[3][c], d[4][c] = "v", "^"
        d[3][-2], d[3][-1], d[4][-2], d[4][-1] = ">", "<", ">", "<"
    else:
        a[0], a[1], a[3], a[4] = [0] * w, [1] * w, [2] * w, [3] * w
        a[2] = [1 + c % 2 for c in range(w)]
        vertical(0); horizontal(2); vertical(3)
    return colors, a, d

def large(h, w):
    a, d = [[0] * w for _ in range(h)], [["?"] * w for _ in range(h)]
    a[0] = [0] * (w - 1) + [1]
    a[1] = [1] * w; a[1][-2] = 0
    a[2] = [1] * w; a[2][1] = a[2][-2] = 0
    a[3] = [0] * w; a[3][0] = a[3][-1] = 1
    for r in range(4, h - 2): a[r] = [1 if c % 2 == 0 else 0 for c in range(w - 2)] + [0, 1]
    a[-2], a[-1] = [1] * w, [2] * w
    for c in range(w - 2): d[0][c], d[1][c] = "v", "^"
    for r in range(4): d[r][-2], d[r][-1] = ">", "<"
    d[2][0], d[2][1], d[3][0], d[3][1] = ">", "<", ">", "<"
    for c in range(2, w - 2): d[2][c], d[3][c] = "v", "^"
    for r in range(4, h - 2):
        for c in range(0, w, 2): d[r][c], d[r][c + 1] = ">", "<"
    for c in range(w): d[-2][c], d[-1][c] = "v", "^"
    return 3, a, d

H, W = map(int, sys.stdin.buffer.read().split())
swapped, h, w = H > W, min(H, W), max(H, W)
ans = small(h, w) if h <= 5 else large(h, w) if w % 2 == 0 else transpose(large(w, h))
if swapped: ans = transpose(ans)
colors, a, d = ans
out = [str(colors)]
for r in range(H):
    for c in range(W):
        if d[r][c] not in (">", "v"): continue
        nr, nc = r + (d[r][c] == "v"), c + (d[r][c] == ">")
        out.append(f"{r + 1} {c + 1} {a[r][c] + 1} {nr + 1} {nc + 1} {a[nr][nc] + 1}")
print("\n".join(out))
0