結果
| 問題 |
No.3303 Heal Slimes 2
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-05 15:46:15 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 3,341 bytes |
| コンパイル時間 | 346 ms |
| コンパイル使用メモリ | 82,340 KB |
| 実行使用メモリ | 170,692 KB |
| 最終ジャッジ日時 | 2025-10-06 12:48:02 |
| 合計ジャッジ時間 | 14,375 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 30 WA * 1 |
ソースコード
class FenwickTree:
def __init__(self, n: int):
self.n = n
self.arr = [0] * (n + 1)
# n以下の最大の2冪
self.powlog_n = 2 ** (n.bit_length() - 1)
def add(self, i: int, x: int):
"""`a[i] += x`
Args:
i (int): 0-indexed
x (int): to add
Note:
If `i` is out of `[0, n)`, do nothing.
"""
if i < 0:
return
i += 1
arr = self.arr
n = self.n
while i <= n:
arr[i] += x
# arr[i] %= mod
i += i & -i
def sum(self, i: int) -> int:
"""get `sum(a[:i])`
Args:
i (int): 0-indexed
Returns:
int: `sum(a[:i])`
"""
ans = 0
arr = self.arr
# mod = self.mod
if i > self.n:
i = self.n
while i > 0:
ans += arr[i]
# ans %= mod
i -= i & -i
return ans
def sum2(self, i: int, j: int) -> int:
"""get `sum(a[i:j])`
Args:
i (int): 0-indexed begin
j (int): 0-indexed end
Returns:
int: `sum(a[i:j])`
"""
ans = self.sum(j) - self.sum(i)
# ans %= mod
return ans
def lower_bound(self, w: int) -> int:
"""lower_bound
Args:
w (int): sum
Returns:
int: min `x`(>= 0, 0-indexed) s.t. `sum(a[:x])` >= w
`n + 1` if w > `sum(a[:n])`
Note:
expect `a[i]` >= 0 for all `i`
Reference:
http://hos.ac/slides/20140319_bit.pdf - p.75
"""
if w <= 0:
return 0
arr = self.arr
n = self.n
k = self.powlog_n
x = 0
while k > 0:
if x + k <= n and arr[x + k] < w:
x += k
w -= arr[x]
k //= 2
return x + 1
def get(self, i: int):
"""index access `a[i]`
Args:
i (int): 0-indexed
Returns:
int | None: `a[i]` if 0 <= `i` < n
else `None`
"""
if 0 <= i < self.n:
return self.sum2(i, i + 1)
else:
return None
def __repr__(self) -> str:
a = [self.get(i) for i in range(self.n)]
a_s = " ".join(map(str, a))
return f"FenwickTree({self.n})[{a_s}]"
n, k, d = map(lambda s_: int(s_), input().split())
h = tuple(map(lambda s_: int(s_), input().split()))
h += tuple(hi - d for hi in h)
def coordinate_compress(a, offset=0):
sa = sorted(set(a))
toi = {e: i for i, e in enumerate(sa, offset)}
ha = tuple(toi[ai] for ai in a)
return sa, toi, ha, len(toi)
sa, toi, ha, nn = coordinate_compress(h)
ft0 = FenwickTree(nn)
ft1 = FenwickTree(nn)
def cost():
il = ft0.lower_bound(k)
# l = sa[il]
# ans = l * k - ft1.sum(il)
# ans += ft1.sum2(il, nn) - l * k
ans = ft1.sum2(il, nn) - ft1.sum(il)
return ans
def push(i, c):
ft0.add(ha[i], 1 * c)
ft1.add(ha[i], h[i] * c)
ft0.add(ha[n + i], 1 * c)
ft1.add(ha[n + i], h[n + i] * c)
for i in range(k):
push(i, 1)
ans = cost()
for r in range(k, n):
push(r, 1)
push(r - k, -1)
ansi = cost()
ans = min(ans, ansi)
ans = (ans - d * k) // 2
print(ans)