結果
| 問題 |
No.1982 [Cherry 4th Tune B] 絶険
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 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()
gew1fw