結果
問題 | No.2650 [Cherry 6th Tune *] セイジャク |
ユーザー |
👑 ![]() |
提出日時 | 2023-07-17 10:44:44 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 662 ms / 2,500 ms |
コード長 | 3,041 bytes |
コンパイル時間 | 177 ms |
コンパイル使用メモリ | 82,132 KB |
実行使用メモリ | 177,812 KB |
最終ジャッジ日時 | 2024-09-29 05:16:12 |
合計ジャッジ時間 | 17,268 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
import heapqclass Double_Heap:def __init__(self):self.__small=[]self.__large=[]self.__dict={}self.__length=0self.__sum=0def __bool__(self):return bool(self.__length)def __len__(self):return self.__lengthdef __contains__(self, x):return self.is_exist(x)def push(self, x):self.__length+=1self.__sum+=xheapq.heappush(self.__small, x)heapq.heappush(self.__large, -x)if x in self.__dict:self.__dict[x]+=1else:self.__dict[x]=1def discard(self, x):""" x を消す (存在しない場合は何もしない). """if x not in self:returnself.__dict[x]-=1if self.__dict[x]==0:del self.__dict[x]self.__length-=1self.__sum-=xwhile 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.__dictdef get_min(self):assert selfreturn self.__small[0]def pop_min(self):assert selfx=self.get_min()self.discard(x)return xdef get_max(self):assert selfreturn -self.__large[0]def pop_max(self):assert selfx=self.get_max()self.discard(x)return xdef count(self, x):""" x の個数を求める. """return self.__dict.get(x,0)def sum(self):return self.__sumdef __str__(self):return str(self.__dict)def __repr__(self):return "[Double Heap]: "+str(self)#==================================================def solve():N, A = map(int, input().split())X = list(map(int, input().split()))T = int(input())E = set(X)Sound = [None] * Tfor t in range(T):l, r = map(int, input().split())Sound[t] = (l,r)E.add(l); E.add(r)E_inv = {e:i for i,e in enumerate(sorted(E))}K = len(E_inv)person = [[] for _ in range(K)]for i in range(N):xj = E_inv[X[i]]person[xj].append(i)begin = [[] for _ in range(K)]end = [[] for _ in range(K)]for t,(l,r) in enumerate(Sound,1):lj = E_inv[l]; rj = E_inv[r]begin[lj].append(t)end[rj].append(t)H = Double_Heap()ans = [0] * Nfor j in range(K):for t in begin[j]:H.push(t)for i in person[j]:if H:ans[i] = H.get_max()else:ans[i] = -1for t in end[j]:H.discard(t)return ans#==================================================import sysinput=sys.stdin.readlinewrite=sys.stdout.writewrite("\n".join(map(str, solve())))