1
# Runtime: 182 ms (Top 65.24%) | Memory: 20.7 MB (Top 5.08%)4
def __init__(self, n: int):8
self.addSegment(0, self.N - 1)10
def seat(self) -> int:11
start, end, distance = heapq.heappop(self.pq)12
self.dict.pop(start, None) # Remove old segment from dictionary13
self.dict.pop(end, None)20
right = self.addSegment(start + 1, end)22
elif end == self.N - 1:24
left = self.addSegment(start, end - 1)26
elif end - start == 1: # ONLY ONE PLACE TO PUT28
left = self.addSegment(start + 1, end)31
position = start + (end - start) // 232
right = self.addSegment(start, position - 1)33
left = self.addSegment(position + 1, end)37
def leave(self, p: int) -> None:38
left = self.dict.get(p - 1, None)39
right = self.dict.get(p + 1, None)41
new_start = new_end = p44
self.removeSegment(left)45
new_start = left.start48
self.removeSegment(right)51
self.addSegment(new_start, new_end)53
def addSegment(self, start, end):54
segment = Segment(start, end, self.N)55
self.dict[segment.start] = segment56
self.dict[segment.end] = segment57
heapq.heappush(self.pq, segment)59
def removeSegment(self, segment):60
self.dict.pop(segment.start, None)61
self.dict.pop(segment.end, None)62
self.pq.remove(segment)66
def __init__(self, start, end, N):69
self.distance = self.calculateDistance(start, end, N)71
def __lt__(self, other_segment):73
self.distance > other_segment.distance74
if self.distance != other_segment.distance75
else self.start < other_segment.start78
def calculateDistance(self, start, end, N):86
return (end - start) // 289
return iter((self.start, self.end, self.distance))