結果

問題 No.3506 All Distance is Square Number
コンテスト
ユーザー はじっこゆーれー
提出日時 2026-04-18 04:18:52
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
WA  
実行時間 -
コード長 3,930 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 236 ms
コンパイル使用メモリ 85,376 KB
実行使用メモリ 117,048 KB
最終ジャッジ日時 2026-04-18 04:19:12
合計ジャッジ時間 16,372 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge1_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 25 WA * 4
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys
import random
import time
def solve():
    start_time = time.time()
    input_data = sys.stdin.read().split()
    if not input_data:
        return
    N = int(input_data[0])
    is_sq = [False] * 40001
    for i in range(1, 201):
        is_sq[i * i] = True
    if N == 2:
        print("1")
        print("1 2 1")
        print("1\n1")
        return
    P = [0] * N
    for k in range(2, N):
        P[k] = 2 * k - 1
    pref = [0] * (N + 1)
    for k in range(3, N + 1):
        pref[k] = pref[k-1] + P[k-1]
    def dist_outer(u, v):
        if u > v:
            u, v = v, u
        return pref[v] - pref[u]
    def get_path_nodes(start, end):
        if start <= end:
            return list(range(start, end + 1))
        else:
            return list(range(start, end - 1, -1))
    avail_even = [x for x in range(2, 201, 2)]
    while time.time() - start_time < 1.8:
        random.shuffle(avail_even)
        E = [0] * (N + 1)
        for i in range(3, N + 1):
            E[i] = avail_even[i - 3]
        def weight_1(x):
            if x == 2: return 1
            return E[x]
        dist_v_T = [[0] * (N + 1) for _ in range(N + 1)]
        for v in range(2, N + 1):
            for T in range(2, N + 1):
                dist_v_T[v][T] = weight_1(v) + dist_outer(v, T)
        all_found = True
        ans_paths = {}
        for T in range(2, N + 1):
            found = False
            for v in range(2, N + 1):
                if is_sq[dist_v_T[v][T]]:
                    ans_paths[(1, T)] = [1] + get_path_nodes(v, T)
                    found = True
                    break
            if not found:
                all_found = False
                break
        if not all_found:
            continue
        for S in range(2, N):
            for T in range(S + 1, N + 1):
                found = False
                d = dist_outer(S, T)
                if is_sq[d]:
                    ans_paths[(S, T)] = get_path_nodes(S, T)
                    found = True
                    continue
                for u in range(2, N + 1):
                    min1, max1 = (S, u) if S < u else (u, S)
                    d_u = dist_outer(S, u) + weight_1(u)
                    for v in range(2, N + 1):
                        if u == v: continue
                        min2, max2 = (v, T) if v < T else (T, v)
                        if max1 < min2 or max2 < min1:
                            if is_sq[d_u + dist_v_T[v][T]]:
                                ans_paths[(S, T)] = get_path_nodes(S, u) + [1] + get_path_nodes(v, T)
                                found = True
                                break
                    if found:
                        break
                if not found:
                    all_found = False
                    break
            if not all_found:
                break
        if all_found:
            edges = []
            edge_idx = {}
            edges.append((1, 2, 1))
            edge_idx[(1, 2)] = 1
            edge_idx[(2, 1)] = 1
            idx = 2
            for k in range(2, N):
                edges.append((k, k + 1, P[k]))
                edge_idx[(k, k + 1)] = idx
                edge_idx[(k + 1, k)] = idx
                idx += 1
            for v in range(3, N + 1):
                edges.append((1, v, E[v]))
                edge_idx[(1, v)] = idx
                edge_idx[(v, 1)] = idx
                idx += 1
            print(len(edges))
            for u, v, c in edges:
                print(f"{u} {v} {c}")
            for i in range(1, N):
                for j in range(i + 1, N + 1):
                    nodes = ans_paths[(i, j)]
                    e_path = []
                    for k in range(len(nodes) - 1):
                        e_path.append(edge_idx[(nodes[k], nodes[k+1])])
                    print(f"{len(e_path)} {' '.join(map(str, e_path))}")
            return
if __name__ == '__main__':
    solve()
0