結果

問題 No.5008 [Cherry Alpha] Discrete Pendulum with Air Resistance
ユーザー kyskys
提出日時 2022-10-15 00:06:49
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,936 ms / 2,000 ms
コード長 5,076 bytes
コンパイル時間 263 ms
実行使用メモリ 88,128 KB
スコア 1,016,478,581,877,911
最終ジャッジ日時 2022-10-15 00:10:13
合計ジャッジ時間 107,711 ms
ジャッジサーバーID
(参考情報)
judge13 / judge9
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1,933 ms
86,752 KB
testcase_01 AC 1,933 ms
87,232 KB
testcase_02 AC 1,933 ms
86,908 KB
testcase_03 AC 1,933 ms
87,368 KB
testcase_04 AC 1,933 ms
87,560 KB
testcase_05 AC 1,934 ms
87,376 KB
testcase_06 AC 1,933 ms
87,748 KB
testcase_07 AC 1,932 ms
86,780 KB
testcase_08 AC 1,931 ms
87,456 KB
testcase_09 AC 1,932 ms
87,332 KB
testcase_10 AC 1,935 ms
87,352 KB
testcase_11 AC 1,933 ms
88,128 KB
testcase_12 AC 1,934 ms
87,044 KB
testcase_13 AC 1,935 ms
87,760 KB
testcase_14 AC 1,933 ms
87,316 KB
testcase_15 AC 1,935 ms
87,568 KB
testcase_16 AC 1,934 ms
86,892 KB
testcase_17 AC 1,934 ms
87,592 KB
testcase_18 AC 1,932 ms
87,836 KB
testcase_19 AC 1,932 ms
87,100 KB
testcase_20 AC 1,936 ms
86,832 KB
testcase_21 AC 1,932 ms
87,000 KB
testcase_22 AC 1,932 ms
87,496 KB
testcase_23 AC 1,932 ms
87,308 KB
testcase_24 AC 1,933 ms
87,128 KB
testcase_25 AC 1,933 ms
87,440 KB
testcase_26 AC 1,934 ms
87,308 KB
testcase_27 AC 1,933 ms
87,856 KB
testcase_28 AC 1,932 ms
87,816 KB
testcase_29 AC 1,935 ms
87,376 KB
testcase_30 AC 1,932 ms
87,432 KB
testcase_31 AC 1,930 ms
87,512 KB
testcase_32 AC 1,934 ms
86,996 KB
testcase_33 AC 1,933 ms
87,748 KB
testcase_34 AC 1,936 ms
87,488 KB
testcase_35 AC 1,932 ms
87,520 KB
testcase_36 AC 1,932 ms
87,712 KB
testcase_37 AC 1,933 ms
87,104 KB
testcase_38 AC 1,935 ms
87,220 KB
testcase_39 AC 1,932 ms
87,436 KB
testcase_40 AC 1,931 ms
87,804 KB
testcase_41 AC 1,935 ms
87,264 KB
testcase_42 AC 1,934 ms
87,572 KB
testcase_43 AC 1,932 ms
87,032 KB
testcase_44 AC 1,934 ms
87,076 KB
testcase_45 AC 1,934 ms
88,020 KB
testcase_46 AC 1,930 ms
87,728 KB
testcase_47 AC 1,929 ms
87,852 KB
testcase_48 AC 1,933 ms
87,348 KB
testcase_49 AC 1,931 ms
87,504 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

def main():
    from sys import stdin, setrecursionlimit
    # setrecursionlimit(1000000)
    input = stdin.readline
    def iinput(): return int(input())
    def sinput(): return input().rstrip()
    def i0input(): return int(input()) - 1
    def linput(): return list(input().split())
    def liinput(): return list(map(int, input().split()))
    def miinput(): return map(int, input().split())
    def li0input(): return list(map(lambda x: int(x) - 1, input().split()))
    def mi0input(): return map(lambda x: int(x) - 1, input().split())
    INF = 1000000000000000000
    MOD = 1000000007

    from itertools import combinations
    from math import sqrt, exp

    def score():
        X = [[] for _ in [0] * K]
        Y = [[] for _ in [0] * K]
        for b, m, e in zip(Bs, Ms, Es):
            start = 2 * b
            diff = 2 * e
            end = 2 * m
            last = (b - m) // e
            thr = start * (last + 1) - last * (last + 1) // 2 * diff
            for i, t in enumerate(T):
                if t <= thr:
                    ok = MAXBE
                    ng = -1
                    while ng + 1 < ok:
                        ch = (ng + ok) // 2
                        if t < start * (ch + 1) - ch * (ch + 1) // 2 * diff:
                            ng = ch
                        else:
                            ok = ch
                    t -= start * ok - ok * (ok - 1) // 2 * diff
                    if ok % 2:
                        sgn = -1
                    else:
                        sgn = 1
                    if t <= (start - ok * diff) // 2:
                        X[i].append(sgn * t)
                    else:
                        X[i].append(sgn * (start - ok * diff - t))
                else:
                    t -= start * (last + 1) - last * (last + 1) // 2 * diff
                    ok = last + t // end
                    t %= end
                    if ok % 2:
                        sgn = -1
                    else:
                        sgn = 1
                    if t <= end // 2:
                        X[i].append(sgn * t)
                    else:
                        X[i].append(sgn * (end - t))
            for i, t in enumerate(U):
                if t <= thr:
                    ok = MAXBE
                    ng = -1
                    while ng + 1 < ok:
                        ch = (ng + ok) // 2
                        if t < start * (ch + 1) - ch * (ch + 1) // 2 * diff:
                            ng = ch
                        else:
                            ok = ch
                    t -= start * ok - ok * (ok - 1) // 2 * diff
                    if ok % 2:
                        sgn = -1
                    else:
                        sgn = 1
                    if t <= (start - ok * diff) // 2:
                        Y[i].append(sgn * t)
                    else:
                        Y[i].append(sgn * (start - ok * diff - t))
                else:
                    t -= start * (last + 1) - last * (last + 1) // 2 * diff
                    ok = last + t // end
                    t %= end
                    if ok % 2:
                        sgn = -1
                    else:
                        sgn = 1
                    if t <= end // 2:
                        Y[i].append(sgn * t)
                    else:
                        Y[i].append(sgn * (end - t))
        tmp1 = []
        for x in X:
            tmp1.append(0)
            for i in range(N):
                for j in range(i+1, N):
                    tmp1[-1] += abs(x[i] - x[j]) / (Bs[i] + Bs[j])
            tmp1[-1] *= 20000000 / N / (N - 1)
        tmp2 = []
        for x in Y:
            tmp2.append(0)
            for i in range(N):
                for j in range(i+1, N):
                    tmp2[-1] = max(tmp2[-1], abs(x[i] - x[j]))
            tmp2[-1] = 10000000 / sqrt(tmp2[-1] / 20 + 1)
        ans1 = round(sum(tmp1) / K)
        ans2 = round(sum(tmp2) / K)
        return ans1 * ans2

    from random import randint, random

    N, K = miinput()
    MAXBE = 4
    START_TEMP = 10000000
    END_TEMP = 1000

    T = liinput()
    U = liinput()

    Bs = [randint(1, MAXBE) for _ in [0] * N]
    Ms = []
    Es = []

    for b in Bs:
        Ms.append(randint(1, b))
        Es.append(randint(1, b))

    tmp_score = score()
    while time() - S < 1.85:
        idx = randint(0, N-1)
        newb = randint(1, MAXBE)
        newm = randint(1, newb)
        newe = randint(1, newb)
        oldb = Bs[idx]
        oldm = Ms[idx]
        olde = Es[idx]
        Bs[idx], Ms[idx], Es[idx] = newb, newm, newe
        new_score = score()
        temp = START_TEMP + (END_TEMP - START_TEMP) * time() / 2
        if exp((new_score - tmp_score) / temp) < random():
            Bs[idx], Ms[idx], Es[idx] = oldb, oldm, olde
        else:
            tmp_score = new_score
            # print(tmp_score)

    for b, m, e in zip(Bs, Ms, Es):
        print(b, m, e)
    # from math import log10
    # print(log10(score() * 50))
from time import time
S = time()

main()
0