結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
vwxyz
|
| 提出日時 | 2022-03-30 02:21:35 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 784 ms / 3,000 ms |
| コード長 | 3,903 bytes |
| 記録 | |
| コンパイル時間 | 438 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 19,072 KB |
| 最終ジャッジ日時 | 2024-11-09 01:31:23 |
| 合計ジャッジ時間 | 12,029 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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):
self.queueL=[]
self.queueR=[]
self.L=L
self.R=R
self.median=median
if self.median:
self.median_value=None
def Push_Left(self,x):
_heappush_max(self.queueL,heappushpop(self.queueR,x))
def Push_Right(self,x):
heappush(self.queueR,_heappushpop_max(self.queueL,x))
def Pop_Left(self):
if self.queueL:
return _heappop_max(self.queueL)
else:
return None
def Pop_Right(self):
if self.queueR:
return heappop(self.queueR)
else:
return None
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==None:
if x<self.queueL[0]:
self.median_value=_heappushpop_max(self.queueL,x)
elif self.queueR[0]<x:
self.median_value=heappushpop(self.queueR,x)
else:
self.median_value=x
else:
if self.median_value<=x:
_heappush_max(self.queueL,self.median_value)
heappush(self.queueR,x)
else:
_heappush_max(self.queueL,x)
heappush(self.queueR,self.median_value)
def Pop(self):
if self.L:
if len(self.queueL)==self.L:
retu=self.Pop_Left()
if self.queueR:
_heappush_max(self.queueL,heappop(self.queueR))
return retu
else:
return None
if self.R:
if len(self.queueR)==self.R:
retu=self.Pop_Right()
if self.queueL:
heappush(self.queueR,_heappop_max(self.queueL))
return retu
else:
return None
if self.median:
if self.median_value==None:
return self.Pop_Left(),self.Pop_Right()
else:
retu=self.median_value
self.median_value=None
return retu
def Top(self):
if self.L:
if len(self.queueL)==self.L:
return self.queueL[0]
else:
return None
if self.R:
if len(self.queueR)==self.R:
return self.queueR[0]
else:
return None
if self.median:
if self.median_value==None:
if self.queueL:
return self.queueL[0],self.queueR[0]
else:
return None
else:
return self.median_value
def __len__(self):
return len(self.queueL)+len(self.queueR)
def __str__(self):
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.Pop()
if ans==None:
ans=-1
else:
ans=-ans
print(ans)
vwxyz