結果
問題 |
No.1982 [Cherry 4th Tune B] 絶険
|
ユーザー |
![]() |
提出日時 | 2025-06-12 18:05:10 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,927 bytes |
コンパイル時間 | 145 ms |
コンパイル使用メモリ | 82,228 KB |
実行使用メモリ | 200,536 KB |
最終ジャッジ日時 | 2025-06-12 18:06:36 |
合計ジャッジ時間 | 6,942 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 3 TLE * 1 -- * 31 |
ソースコード
import sys import bisect def main(): input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]); ptr +=1 K = int(input[ptr]); ptr +=1 Q = int(input[ptr]); ptr +=1 L = [] R = [] C = [] H = [] for _ in range(K): Lk = int(input[ptr]); ptr +=1 Rk = int(input[ptr]); ptr +=1 Ck = int(input[ptr]); ptr +=1 Hk = int(input[ptr]); ptr +=1 L.append(Lk) R.append(Rk) C.append(Ck) H.append(Hk) # Persistent BIT (each version is a list of the BIT state after each operation) # However, implementing a persistent BIT with range updates is complex. # For the sake of this problem, we'll use a different approach. # Precompute for each i, the list of operations that include i, sorted by k. # This is O(K log N) time using a segment tree. class SegmentTreeNode: def __init__(self, l, r): self.l = l self.r = r self.left = None self.right = None self.ops = [] def is_leaf(self): return self.l == self.r def build(l, r): node = SegmentTreeNode(l, r) if l != r: mid = (l + r) // 2 node.left = build(l, mid) node.right = build(mid+1, r) return node def insert(node, l, r, k): if node.r < l or node.l > r: return if l <= node.l and node.r <= r: node.ops.append(k) return insert(node.left, l, r, k) insert(node.right, l, r, k) root = build(1, N) for k in range(K): insert(root, L[k], R[k], k) # For each query, collect all ops that include I, sorted by k # Then compute prefix sums and binary search def get_ops(node, i): ops = [] if node.is_leaf(): return node.ops.copy() if node.left.l <= i <= node.left.r: ops += get_ops(node.left, i) else: ops += get_ops(node.right, i) ops += node.ops return ops for _ in range(Q): I = int(input[ptr]); ptr +=1 X = int(input[ptr]); ptr +=1 X_target = X - 0.5 # Collect all ops that include I ops_k = get_ops(root, I) # Sort the ops by k (ascending) ops_k.sort() # Compute prefix sums prefix = [] sum_h = 0 for k in ops_k: sum_h += H[k] prefix.append(sum_h) # Binary search for X_target idx = bisect.bisect_left(prefix, X_target) if idx < len(prefix): # Check if the found operation includes I k = ops_k[idx] if L[k] <= I <= R[k]: print(C[k]) else: # This should not happen since the ops are those that include I print(-1) else: print(-1) if __name__ == '__main__': main()