結果
問題 |
No.647 明太子
|
ユーザー |
![]() |
提出日時 | 2025-03-20 20:32:03 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 144 ms / 4,500 ms |
コード長 | 2,825 bytes |
コンパイル時間 | 167 ms |
コンパイル使用メモリ | 82,336 KB |
実行使用メモリ | 82,668 KB |
最終ジャッジ日時 | 2025-03-20 20:33:01 |
合計ジャッジ時間 | 3,048 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 20 |
ソースコード
import bisect def main(): import sys input = sys.stdin.read().split() ptr = 0 n = int(input[ptr]) ptr +=1 members = [] for _ in range(n): a = int(input[ptr]) b = int(input[ptr+1]) members.append((a, b)) ptr +=2 # Sort members by A_j ascending, then B_j ascending members.sort(key=lambda x: (x[0], x[1])) sorted_A = [x[0] for x in members] sorted_B = [x[1] for x in members] m = int(input[ptr]) ptr +=1 mentaiko_list = [] for _ in range(m): x = int(input[ptr]) y = int(input[ptr+1]) mentaiko_list.append((x, y)) ptr +=2 class SegmentTree: def __init__(self, data): self.n = len(data) self.size = 1 while self.size < self.n: self.size <<= 1 self.tree = [[] for _ in range(2 * self.size)] for i in range(self.n): self.tree[self.size + i] = [data[i]] for i in range(self.size - 1, 0, -1): left = self.tree[2 * i] right = self.tree[2 * i + 1] merged = [] l_ptr = r_ptr = 0 while l_ptr < len(left) and r_ptr < len(right): if left[l_ptr] <= right[r_ptr]: merged.append(left[l_ptr]) l_ptr +=1 else: merged.append(right[r_ptr]) r_ptr +=1 merged.extend(left[l_ptr:]) merged.extend(right[r_ptr:]) self.tree[i] = merged def query(self, l, r, y): res = 0 l += self.size r += self.size while l < r: if l % 2 == 1: res += bisect.bisect_right(self.tree[l], y) l +=1 if r % 2 == 1: r -=1 res += bisect.bisect_right(self.tree[r], y) l >>=1 r >>=1 return res if not sorted_B: st = None else: st = SegmentTree(sorted_B) max_count = 0 counts = [] for idx, (x, y) in enumerate(mentaiko_list): low = bisect.bisect_left(sorted_A, x) if low >= len(sorted_A): cnt = 0 else: if st is None: cnt =0 else: cnt = st.query(low, len(sorted_A), y) counts.append((cnt, idx +1)) if cnt > max_count: max_count = cnt result = [] for cnt, num in counts: if cnt == max_count and cnt >0: result.append(num) result.sort() if len(result) ==0: print(0) else: print('\n'.join(map(str, result))) if __name__ == '__main__': main()