結果
問題 | No.5008 [Cherry Alpha] Discrete Pendulum with Air Resistance |
ユーザー |
|
提出日時 | 2022-10-14 23:38:34 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,887 ms / 2,000 ms |
コード長 | 5,049 bytes |
コンパイル時間 | 255 ms |
実行使用メモリ | 88,516 KB |
スコア | 139,460,876,471,022 |
最終ジャッジ日時 | 2022-10-14 23:40:21 |
合計ジャッジ時間 | 104,792 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge9 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
def main():from sys import stdin, setrecursionlimit# setrecursionlimit(1000000)input = stdin.readlinedef iinput(): return int(input())def sinput(): return input().rstrip()def i0input(): return int(input()) - 1def 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 = 1000000000000000000MOD = 1000000007from itertools import combinationsfrom math import sqrt, expdef score():X = [[] for _ in [0] * K]Y = [[] for _ in [0] * K]for b, m, e in zip(Bs, Ms, Es):start = 2 * bdiff = 2 * eend = 2 * mlast = (b - m) // ethr = start * (last + 1) - last * (last + 1) // 2 * difffor i, t in enumerate(T):if t <= thr:ok = MAXBEng = -1while ng + 1 < ok:ch = (ng + ok) // 2if t < start * (ch + 1) - ch * (ch + 1) // 2 * diff:ng = chelse:ok = cht -= start * ok - ok * (ok - 1) // 2 * diffif ok % 2:sgn = -1else:sgn = 1if 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 * diffok = last + t // endt %= endif ok % 2:sgn = -1else:sgn = 1if 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 = MAXBEng = -1while ng + 1 < ok:ch = (ng + ok) // 2if t < start * (ch + 1) - ch * (ch + 1) // 2 * diff:ng = chelse:ok = cht -= start * ok - ok * (ok - 1) // 2 * diffif ok % 2:sgn = -1else:sgn = 1if 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 * diffok = last + t // endt %= endif ok % 2:sgn = -1else:sgn = 1if 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 * ans2from random import randint, randomN, K = miinput()MAXBE = 10**3START_TEMP = 10000000END_TEMP = 1000T = liinput()U = liinput()Bs = [randint(1, MAXBE) for _ in [0] * N]Ms = []for b in Bs:Ms.append(randint(1, b))Es = [randint(1, MAXBE) for _ in [0] * N]tmp_score = score()while time() - S < 1.8:idx = randint(0, N-1)newb = randint(1, MAXBE)newm = randint(1, newb)newe = randint(1, MAXBE)oldb = Bs[idx]oldm = Ms[idx]olde = Es[idx]Bs[idx], Ms[idx], Es[idx] = newb, newm, newenew_score = score()temp = START_TEMP + (END_TEMP - START_TEMP) * time() / 2if exp((new_score - tmp_score) / temp) < random():Bs[idx], Ms[idx], Es[idx] = oldb, oldm, oldeelse:tmp_score = new_score# print(tmp_score)for b, m, e in zip(Bs, Ms, Es):print(b, m, e)# print(score() * 50)from time import timeS = time()main()