結果
| 問題 | No.3303 Heal Slimes 2 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2025-10-20 23:30:15 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 829 ms / 4,000 ms | 
| コード長 | 1,442 bytes | 
| コンパイル時間 | 190 ms | 
| コンパイル使用メモリ | 82,620 KB | 
| 実行使用メモリ | 148,904 KB | 
| 最終ジャッジ日時 | 2025-10-21 10:28:48 | 
| 合計ジャッジ時間 | 20,045 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 32 | 
ソースコード
import sys
from bisect import bisect_left, bisect_right
input=lambda:sys.stdin.readline().rstrip("\r\n")
MI=lambda:map(int,input().split())
li=lambda:list(MI())
ii=lambda:int(input())
class BIT:
    def __init__(self,n):
        self.n=n
        self.b=[0]*(n+1)
    def add(self,i,v):
        while i<=self.n:
            self.b[i]+=v
            i+=i&-i
    def sum(self,i):
        s=0
        while i>0:
            s+=self.b[i]
            i-=i&-i
        return s
    def kth(self,k):
        i=0
        p=1<<((self.n).bit_length()-1)
        while p:
            j=i+p
            if j<=self.n and self.b[j]<k:
                k-=self.b[j]
                i=j
            p>>=1
        return i+1
n,k,d=MI()
a=li()
hv=sorted(set(a))
uv=sorted(set(a+[x-d for x in a]))
bc=BIT(len(hv))
bs=BIT(len(hv))
bu=BIT(len(uv))
def add(x,sgn):
    i=bisect_left(hv,x)+1
    bc.add(i,sgn)
    bs.add(i,sgn*x)
    j=bisect_left(uv,x)+1
    bu.add(j,sgn)
    j2=bisect_left(uv,x-d)+1
    bu.add(j2,sgn)
tot=0
for i in range(k):
    x=a[i]
    add(x,1)
    tot+=x
def cur():
    L=uv[bu.kth(k)-1]
    iL=bisect_left(hv,L)
    lc=bc.sum(iL)
    ls=bs.sum(iL)
    R=L+d
    iR=bisect_right(hv,R)
    le=bc.sum(iR)
    se=bs.sum(iR)
    rc=k-le
    sr=tot-se
    return lc*L-ls+sr-rc*R
ans=cur()
l=0
for r in range(k,n):
    x=a[l]
    add(x,-1)
    tot-=x
    l+=1
    x=a[r]
    add(x,1)
    tot+=x
    v=cur()
    if v<ans: ans=v
print(ans)
            
            
            
        