結果
| 問題 |
No.3303 Heal Slimes 2
|
| コンテスト | |
| ユーザー |
sasa8uyauya
|
| 提出日時 | 2025-10-11 13:39:41 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,680 ms / 4,000 ms |
| コード長 | 1,612 bytes |
| コンパイル時間 | 312 ms |
| コンパイル使用メモリ | 82,568 KB |
| 実行使用メモリ | 142,932 KB |
| 最終ジャッジ日時 | 2025-10-21 10:28:23 |
| 合計ジャッジ時間 | 38,677 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
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)
sasa8uyauya