結果
| 問題 |
No.953 席
|
| コンテスト | |
| ユーザー |
maspy
|
| 提出日時 | 2020-03-22 02:40:48 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,376 bytes |
| コンパイル時間 | 211 ms |
| コンパイル使用メモリ | 13,056 KB |
| 実行使用メモリ | 42,788 KB |
| 最終ジャッジ日時 | 2024-12-24 07:56:29 |
| 合計ジャッジ時間 | 21,316 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 16 WA * 7 RE * 2 |
ソースコード
#!/usr/bin/ python3.8
import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
from collections import deque
from heapq import heappop, heappush, heapify
from collections import defaultdict
N, K1, K2 = map(int, readline().split())
Q = int(readline())
priority = [0] * (N + 2)
if K1 < K2:
for i in range(K1):
priority[i] = 2 * (K1 - i)
for i in range(K2, N + 1):
priority[i] = 2 * (i - K2) + 1
else:
for i in range(K2):
priority[i] = 2 * (K2 - i) + 1
for i in range(K1, N + 1):
priority[i] = 2 * (i - K1)
INF = max(priority) + 1
priority[-1] = INF + 1
priority[0] = INF
p_to_i = [0] * (max(priority) + 1)
for i, x in enumerate(priority):
p_to_i[x] = i
class RemovableHeap():
def __init__(self, data):
self.n_elem = len(data)
self.data = data
heapify(self.data)
self.counter = defaultdict(int)
for x in data:
self.counter[x] += 1
def top(self):
while True:
x = self.data[0]
if not self.counter[x]:
heappop(self.data)
return x
def push(self, x):
self.counter[x] += 1
heappush(self.data, x)
self.n_elem += 1
def pop(self):
while True:
x = heappop(self.data)
if self.counter[x]:
self.counter[x] -= 1
self.n_elem -= 1
return x
def remove(self, x):
self.counter[x] -= 1
self.n_elem -= 1
def empty(self):
return self.n_elem == 0
filled = [0] * (N + 10)
seats_0 = RemovableHeap(priority[1:N + 1])
seats_1 = RemovableHeap([])
m = map(int, read().split())
A, B = zip(*zip(m, m))
INF = 10 ** 18
event = [(a, 1, i) for i, a in enumerate(A)]
heapify(event)
waiting = deque()
answer = [0] * Q
now_t = 0
def resolve_waiting():
if not waiting:
return False
if not seats_0.empty():
p = seats_0.pop()
elif not seats_1.empty():
p = seats_1.pop()
else:
return False
k = waiting.popleft()
s = p_to_i[p]
answer[k] = s
filled[s] = 1
heappush(event, (now_t + B[k], 0, k))
if s > 1 and not (filled[s - 1] or filled[s - 2]):
seats_0.remove(priority[s - 1])
seats_1.push(priority[s - 1])
if s < N and not (filled[s + 1] or filled[s + 2]):
seats_0.remove(priority[s + 1])
seats_1.push(priority[s + 1])
return True
def go_home(t, i):
s = answer[i]
filled[s] = 0
if filled[s - 1] or filled[s + 1]:
seats_1.push(priority[s])
else:
seats_0.push(priority[s])
if s > 1 and not (filled[s - 1] or filled[s - 2]):
seats_0.push(priority[s - 1])
seats_1.remove(priority[s - 1])
if s < N and not (filled[s + 1] or filled[s + 2]):
seats_0.push(priority[s + 1])
seats_1.remove(priority[s + 1])
return
while event:
t, q, i = heappop(event)
now_t = t
if q:
# 到着
waiting.append(i)
while resolve_waiting():
pass
continue
# まとめて帰宅
go_home(t, i)
while event:
t, q, i = event[0]
if t > now_t or q == 1:
break
heappop(event)
go_home(t, i)
while resolve_waiting():
pass
print('\n'.join(map(str, answer)))
maspy