結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
vwxyz
|
| 提出日時 | 2022-03-30 08:14:06 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 815 ms / 3,000 ms |
| コード長 | 5,542 bytes |
| 記録 | |
| コンパイル時間 | 259 ms |
| コンパイル使用メモリ | 13,312 KB |
| 実行使用メモリ | 19,200 KB |
| 最終ジャッジ日時 | 2024-11-14 05:51:38 |
| 合計ジャッジ時間 | 12,282 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
import heapq
import sys
from heapq import heappush,heappop,heapify,heappushpop,_heappop_max,_heapify_max
def _heappush_max(heap,item):
heap.append(item)
heapq._siftdown_max(heap, 0, len(heap)-1)
def _heappushpop_max(heap, item):
if heap and item < heap[0]:
item, heap[0] = heap[0], item
heapq._siftup_max(heap, 0)
return item
readline=sys.stdin.readline
class Slope_Trick:
def __init__(self,L=False,R=False,median=False,label=False,f=None,f_inve=None,e=None):
self.queueL=[]
self.queueR=[]
self.L=L
self.R=R
self.median=median
if self.median:
self.median_value=None
self.label=label
if self.label:
self.f=f
self.f_inve=f_inve
self.e=e
self.labelL=self.e
self.labelR=self.e
def heappush(self,x):
heappush(self.queueR,x)
if self.label:
self.labelR=self.f(self.labelR,x)
def heappop(self):
x=heappop(self.queueR)
if self.label:
self.labelR=self.f_inve(self.labelR,x)
return x
def heappushpop(self,x):
y=heappushpop(self.queueR,x)
if self.label:
self.labelR=self.f(self.labelR,x)
self.labelR=self.f_inve(self.labelR,y)
return y
def _heappush_max(self,x):
_heappush_max(self.queueL,x)
if self.label:
self.labelL=self.f(self.labelL,x)
def _heappop_max(self):
x=_heappop_max(self.queueL)
if self.label:
self.labelL=self.f_inve(self.labelL,x)
return x
def _heappushpop_max(self,x):
y=_heappushpop_max(self.queueL,x)
if self.label:
self.labelL=self.f(self.labelL,x)
self.labelL=self.f_inve(self.labelL,y)
return y
def Push_Left(self,x):
self._heappush_max(self.heappushpop(x))
def Push_Right(self,x):
self.heappush(self._heappushpop_max(x))
def Pop_Left(self):
if self.queueL:
retu=self._heappop_max()
else:
retu=None
return retu
def Pop_Right(self):
if self.queueR:
retu=self.heappop()
else:
retu=None
return retu
def Push(self,x):
if self.L:
if len(self.queueL)<self.L:
self.Push_Left(x)
else:
self.Push_Right(x)
if self.R:
if len(self.queueR)<self.R:
self.Push_Right(x)
else:
self.Push_Left(x)
if self.median:
if self.median_value==None:
if self.queueL and x<self.queueL[0]:
self.median_value=self._heappushpop_max(x)
elif self.queueR and self.queueR[0]<x:
self.median_value=self.heappushpop(x)
else:
self.median_value=x
else:
if self.median_value<=x:
self._heappush_max(self.median_value)
self.heappush(x)
else:
self._heappush_max(x)
self.heappush(self.median_value)
self.median_value=None
def Pop(self):
if self.L:
if len(self.queueL)==self.L:
retu=self._heappop_max()
if self.queueR:
self._heappush_max(self.heappop())
else:
retu=None
if self.R:
if len(self.queueR)==self.R:
retu=self.heappop()
if self.queueL:
self.heappush(self._heappop_max())
else:
retu=None
if self.median:
if self.median_value==None:
retu=(self.Pop_Left(),self.Pop_Right())
else:
retu=(self.median_value,None)
self.median_value=None
return retu
def Top(self):
if self.L:
if len(self.queueL)==self.L:
retu=self.queueL[0]
else:
retu=None
if self.R:
if len(self.queueR)==self.R:
retu=self.queueR[0]
else:
retu=None
if self.median:
if self.median_value==None:
if self.queueL:
retu=(self.queueL[0],self.queueR[0])
else:
retu=(None,None)
else:
retu=(self.median_value,None)
return retu
def __len__(self):
retu=len(self.queueL)+len(self.queueR)
if self.median and self.median_value!=None:
retu+=1
return retu
def __str__(self):
if self.median:
if self.median_value==None:
return "["+", ".join(map(str,sorted(self.queueL)))+"]+["+", ".join(map(str,sorted(self.queueR)))+"]"
else:
return "["+", ".join(map(str,sorted(self.queueL)))+"]+"+str(self.median_value)+"+["+", ".join(map(str,sorted(self.queueR)))+"]"
else:
return "["+", ".join(map(str,sorted(self.queueL)))+"]+["+", ".join(map(str,sorted(self.queueR)))+"]"
Q,K=map(int,readline().split())
ST=Slope_Trick(R=K)
for _ in range(Q):
data=map(int,readline().split())
q=next(data)
if q==1:
v=next(data)
ST.Push(-v)
else:
ans=ST.Top()
ST.Pop()
if ans==None:
ans=-1
else:
ans=-ans
print(ans)
vwxyz