結果
| 問題 |
No.2101 [Cherry Alpha N] ずっとこの数列だったらいいのに
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 14:03:04 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,564 bytes |
| コンパイル時間 | 345 ms |
| コンパイル使用メモリ | 82,180 KB |
| 実行使用メモリ | 52,992 KB |
| 最終ジャッジ日時 | 2025-06-12 14:04:28 |
| 合計ジャッジ時間 | 12,462 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 TLE * 1 -- * 38 |
ソースコード
import sys
import bisect
def main():
input = sys.stdin.read().split()
ptr = 0
N = int(input[ptr])
ptr += 1
A = []
T = []
prefix_A = [0] * (N + 1)
for i in range(N):
a = int(input[ptr])
t = int(input[ptr+1])
ptr += 2
A.append(a)
T.append(t)
prefix_A[i+1] = prefix_A[i] + a
# Precompute low and high for each element
low = [T[i] for i in range(N)]
high = [T[i] + A[i] -1 if A[i] > 0 else T[i] for i in range(N)]
A_values = A
# Build segment tree
class SegmentTreeNode:
def __init__(self, l, r):
self.l = l
self.r = r
self.left = None
self.right = None
self.data = []
def add(self, idx, low_val, high_val, a_val):
self.data.append( (low_val, high_val, a_val) )
self.data.sort()
def merge(self, left, right):
self.data = []
i = j = 0
left_data = left.data
right_data = right.data
while i < len(left_data) and j < len(right_data):
if left_data[i][0] < right_data[j][0]:
self.data.append(left_data[i])
i += 1
else:
self.data.append(right_data[j])
j += 1
while i < len(left_data):
self.data.append(left_data[i])
i += 1
while j < len(right_data):
self.data.append(right_data[j])
j += 1
# Function to build the segment tree
def build(l, r):
node = SegmentTreeNode(l, r)
if l == r:
# Add the element
low_val = low[l]
high_val = high[l]
a_val = A_values[l]
node.add(l, low_val, high_val, a_val)
return node
else:
mid = (l + r) // 2
node.left = build(l, mid)
node.right = build(mid+1, r)
node.merge(node.left, node.right)
return node
root = build(0, N-1)
Q = int(input[ptr])
ptr += 1
for _ in range(Q):
D = int(input[ptr])
L = int(input[ptr+1])
R = int(input[ptr+2])
ptr += 3
L -= 1
R -= 1
# Compute sum_A in [L, R]
sum_A = prefix_A[R+1] - prefix_A[L]
# Compute sum_s
count1 = 0
sum_T1 = 0
sum_A2 = 0
# Function to query the segment tree
def query(node, l, r, D_val):
nonlocal count1, sum_T1, sum_A2
if node.r < l or node.l > r:
return
if l <= node.l and node.r <= r:
# Process this node
data = node.data
# Find the index where low_i > D_val
idx = bisect.bisect_right(data, (D_val, float('inf'), float('inf')))
# All elements before idx have low_i <= D_val
for i in range(idx):
low_i, high_i, a_i = data[i]
if D_val < high_i:
count1 +=1
sum_T1 += low_i
else:
sum_A2 += a_i
return
query(node.left, l, r, D_val)
query(node.right, l, r, D_val)
query(root, L, R, D)
sum_part1 = (D + 1) * count1 - sum_T1
sum_part2 = sum_A2
sum_s = sum_part1 + sum_part2
result = sum_A - sum_s
print(result)
if __name__ == '__main__':
main()
gew1fw