結果
問題 | No.5008 [Cherry Alpha] Discrete Pendulum with Air Resistance |
ユーザー |
|
提出日時 | 2022-10-14 23:12:41 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 4,832 bytes |
コンパイル時間 | 321 ms |
実行使用メモリ | 100,544 KB |
スコア | 0 |
最終ジャッジ日時 | 2022-10-14 23:13:29 |
合計ジャッジ時間 | 43,815 ms |
ジャッジサーバーID (参考情報) |
judge9 / judge8 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | RE * 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 sqrtdef 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 = sum(tmp1) / Kans2 = sum(tmp2) / Kreturn ans1 * ans2from random import randintN, K = miinput()MAXBE = 10**9T = 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(1, N)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()if new_score < tmp_score:Bs[idx], Ms[idx], Es[idx] = oldb, oldm, oldeelse:tmp_score = new_scorefor b, m, e in zip(Bs, Ms, Es):print(b, m, e)from time import timeS = time()main()