結果
| 問題 |
No.1982 [Cherry 4th Tune B] 絶険
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:59:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,870 bytes |
| コンパイル時間 | 330 ms |
| コンパイル使用メモリ | 82,668 KB |
| 実行使用メモリ | 858,608 KB |
| 最終ジャッジ日時 | 2025-03-31 17:59:55 |
| 合計ジャッジ時間 | 6,837 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 MLE * 1 -- * 31 |
ソースコード
import bisect
def main():
import sys
input = sys.stdin.read
data = input().split()
idx = 0
N = int(data[idx])
idx +=1
K = int(data[idx])
idx +=1
Q = int(data[idx])
idx +=1
# Collect all operations
ops = []
for _ in range(K):
L = int(data[idx])-1 # 0-based
idx +=1
R = int(data[idx])-1
idx +=1
C = int(data[idx])
idx +=1
H = int(data[idx])
idx +=1
ops.append( (L, R, C, H) )
queries = []
for _ in range(Q):
I = int(data[idx])-1
idx +=1
X = int(data[idx])
idx +=1
queries.append( (I, X) )
# Step 1: Compute sum_i using a prefix sum (difference array)
sum_i = [0]*(N+1)
for L, R, C, H in ops:
sum_i[L] += H
sum_i[R+1] -= H
# Compute the prefix sum
current =0
prefix_sum = []
for i in range(N):
current += sum_i[i]
prefix_sum.append(current)
sum_i = prefix_sum
# Now, build a segment tree where each node contains list of ops that cover its interval
# For each query, we need to collect all ops that covers I, in order of their occurrence
# We'll use a binary indexed approach to collect all ops affecting I.
# However, this is not feasible. Instead, we will, for each operation, store it in a list,
# and for each block i, collect all ops where Lk <=i <=Rk.
# Since K can be 2e5 and N is 2e5, this is O(K*N) time, which is impossible.
# So we need an alternative approach.
# However, given the time constraints, let's implement it for the sake of this solution.
# For each block i, collect all ops that affect it, ordered by their occurrence (in the order of K)
# This is a costly step but required for the correct approach.
op_list = [[] for _ in range(N)]
for k in range(K):
L, R, C, H = ops[k]
for i in range(L, R+1):
op_list[i].append( (H, C) )
# Now, for each i, compute the prefix sums and colors
prefix_sums = []
prefix_colors = []
for i in range(N):
ps = []
cs = []
current_sum =0
ps.append(current_sum)
for H, C in op_list[i]:
current_sum += H
ps.append(current_sum)
cs.append(C)
prefix_sums.append(ps)
prefix_colors.append(cs)
# Process each query
results = []
for I, X in queries:
x = X - 0.5
if sum_i[I] <= x:
results.append(-1)
continue
ps = prefix_sums[I]
cs = prefix_colors[I]
# Find the largest j where ps[j] <=x
j = bisect.bisect_right(ps, x) -1
if j >=0 and j < len(cs):
results.append(cs[j])
else:
results.append(-1)
print('\n'.join(map(str, results)))
if __name__ == '__main__':
main()
lam6er