結果
| 問題 | 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)
            
            
            
        