結果
| 問題 |
No.2304 Distinct Elements
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-23 02:17:16 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 579 ms / 3,000 ms |
| コード長 | 1,948 bytes |
| コンパイル時間 | 386 ms |
| コンパイル使用メモリ | 82,700 KB |
| 実行使用メモリ | 129,388 KB |
| 最終ジャッジ日時 | 2024-11-14 12:49:01 |
| 合計ジャッジ時間 | 15,209 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 58 |
ソースコード
import sys
from collections import deque, Counter
input = lambda: sys.stdin.readline().rstrip()
ii = lambda: int(input())
mi = lambda: map(int, input().split())
li = lambda: list(mi())
inf = 2 ** 63 - 1
mod = 998244353
import heapq
class MedianHeap():
def __init__(self):
self.top = []
self.bottom = []
def __len__(self):
return len(self.top) + len(self.bottom)
def add(self, x):
heapq.heappush(self.top, x)
while len(self.top) - 2 >= len(self.bottom):
heapq.heappush(self.bottom, -heapq.heappop(self.top))
while self.top and self.bottom and self.top[0] < -self.bottom[0]:
x = heapq.heappop(self.top)
y = heapq.heappop(self.bottom)
heapq.heappush(self.top, -y)
heapq.heappush(self.bottom, -x)
def med(self):
if len(self) % 2:
return self.top[0], self.top[0]
else:
return -self.bottom[0], self.top[0]
n = ii()
a = li()
a.sort()
a = [a[i] - i for i in range(n)]
stack = []
for V in a:
M = MedianHeap()
M.add(V)
stack.append(M)
while len(stack) >= 2:
X = stack.pop()
Y = stack.pop()
m2, M2 = X.med()
m1, M1 = Y.med()
if M1 <= M2:
stack.append(Y)
stack.append(X)
break
else:
if len(X) < len(Y):
for v in X.top:
Y.add(v)
for v in X.bottom:
Y.add(-v)
stack.append(Y)
else:
for v in Y.top:
X.add(v)
for v in Y.bottom:
X.add(-v)
stack.append(X)
P = [len(stack[i]) for i in range(len(stack))]
cnt = 0
b = [0] * n
for i, v in enumerate(P):
med = stack[i].med()[0]
for x in range(v):
b[cnt] = med
cnt += 1
ans = sum([abs(a[i] - b[i]) for i in range(n)])
print(ans)