結果
| 問題 |
No.2217 Suffix+
|
| コンテスト | |
| ユーザー |
👑 Kazun
|
| 提出日時 | 2023-02-17 21:26:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 242 ms / 2,000 ms |
| コード長 | 2,967 bytes |
| コンパイル時間 | 168 ms |
| コンパイル使用メモリ | 82,408 KB |
| 実行使用メモリ | 92,840 KB |
| 最終ジャッジ日時 | 2024-07-19 12:27:55 |
| 合計ジャッジ時間 | 5,636 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 33 |
ソースコード
def General_Binary_Decrease_Search_Integer(L, R, cond, default=None):
""" 条件式が単調減少であるとき, 整数上で二部探索を行う.
L: 解の下限
R: 解の上限
cond: 条件 (1変数関数, 広義単調減少 を満たす)
default: R で条件を満たさないときの返り値
"""
if not(cond(L)):
return default
if cond(R):
return R
L-=1
while R-L>1:
C=L+(R-L)//2
if cond(C):
L=C
else:
R=C
return L
#==================================================
import heapq
class Double_Heap:
def __init__(self):
self.__small=[]
self.__large=[]
self.__dict={}
self.__length=0
self.__sum=0
def __bool__(self):
return bool(self.__length)
def __len__(self):
return self.__length
def __contains__(self, x):
return self.is_exist(x)
def push(self, x):
self.__length+=1
self.__sum+=x
heapq.heappush(self.__small, x)
heapq.heappush(self.__large, -x)
if x in self.__dict:
self.__dict[x]+=1
else:
self.__dict[x]=1
def discard(self, x):
""" x を消す (存在しない場合は何もしない). """
if x not in self:
return
self.__dict[x]-=1
if self.__dict[x]==0:
del self.__dict[x]
self.__length-=1
self.__sum-=x
while self.__small and (self.__small[0] not in self):
heapq.heappop(self.__small)
while self.__large and (-self.__large[0] not in self):
heapq.heappop(self.__large)
def is_exist(self, x):
""" キューに x が存在するかどうかを判定する. """
return x in self.__dict
def get_min(self):
assert self
return self.__small[0]
def pop_min(self):
assert self
x=self.get_min()
self.discard(x)
return x
def get_max(self):
assert self
return -self.__large[0]
def pop_max(self):
assert self
x=self.get_max()
self.discard(x)
return x
def count(self, x):
""" x の個数を求める. """
return self.__dict.get(x,0)
def sum(self):
return self.__sum
def __str__(self):
return str(self.__dict)
def __repr__(self):
return "[Double Heap]: "+str(self)
#==================================================
def solve():
N,K=map(int,input().split())
A=[-1]+list(map(int,input().split()))
def check(X):
count=0
added=0
for i in range(1,N+1):
delta=max(0, X-(A[i]+added))
k=(delta+i-1)//i
count+=k
added+=i*k
return count<=K
return General_Binary_Decrease_Search_Integer(0,10**15,check,-1)
#==================================================
print(solve())
Kazun