結果
問題 |
No.3303 Heal Slimes 2
|
ユーザー |
![]() |
提出日時 | 2025-10-11 13:39:41 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,531 ms / 4,000 ms |
コード長 | 1,612 bytes |
コンパイル時間 | 365 ms |
コンパイル使用メモリ | 82,676 KB |
実行使用メモリ | 142,872 KB |
最終ジャッジ日時 | 2025-10-11 13:40:29 |
合計ジャッジ時間 | 35,544 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 31 |
ソースコード
class BIT: def __init__(self,n): self.n=n self.tree=[0]*(n+1) def add(self,i,x): i+=1 while i<=self.n: self.tree[i]+=x i+=i&-i def _sum(self,i): res=0 i+=1 while i>0: res+=self.tree[i] i-=i&-i return res def sum(self,l,r): return self._sum(r-1)-self._sum(l-1) class FakeMultiset: def __init__(self,a): self.z=sorted(a) self.d={v:i for i,v in enumerate(self.z)} self.n=len(self.z) self.st=BIT(self.n) def add(self,i): self.st.add(self.d[i],1) def remove(self,i): self.st.add(self.d[i],-1) def pop(self,k): k=(k%self.st.sum(0,self.n))+1 ok=self.n ng=-1 while ok-ng>1: m=(ok+ng)//2 if k<=self.st.sum(0,m+1): ok=m else: ng=m self.st.add(ok,-1) return self.z[ok] n,K,D=map(int,input().split()) a=list(map(int,input().split())) ans=sum(a) X=10**10 pl=FakeMultiset([u for v in a for u in [v-D,v]]+[-X,X]) pl.add(-X) pr=FakeMultiset([u for v in a for u in [v-D,v]]+[-X,X]) pr.add(X) h=0 for i in range(n): v=a[i] l,r=v-D,v rr=pr.pop(0) if l<=rr: pr.add(rr) pl.add(l) else: h+=l-rr pl.add(rr) pr.add(l) ll=pl.pop(-1) if ll<=r: pl.add(ll) pr.add(r) else: h+=ll-r pr.add(ll) pl.add(r) if i<K-1: continue ans=min(ans,h) j=i-(K-1) v=a[j] l,r=v-D,v ll=pl.pop(-1) if l<=ll: pl.add(ll) pl.remove(l) else: h-=l-ll pr.remove(l) pr.add(ll) rr=pr.pop(0) if rr<=r: pr.add(rr) pr.remove(r) else: h-=rr-r pl.remove(r) pl.add(rr) print(ans)