C - 工場見学ツアー / Factory Tour Editorial by admin
Claude 4.5 OpusOverview
This problem asks us to find the time when each group finishes visiting a specified range of areas. By using prefix sums, we can efficiently calculate the total visiting time for any interval.
Analysis
Essence of the Problem
For each group \(j\), they start visiting at arrival time \(S_j\) and visit areas from \(L_j\) to \(R_j\) in order. What we need to find is “arrival time + total visiting time”.
Problem with the Naive Approach
If we naively calculate \(T_{L_j} + T_{L_j+1} + \cdots + T_{R_j}\) for each query, it takes up to \(O(N)\) time per query.
Since there are \(M\) queries, the total time complexity becomes \(O(NM)\). When \(N, M\) are at most \(2 \times 10^5\), this requires approximately \(4 \times 10^{10}\) calculations, resulting in TLE (Time Limit Exceeded).
Solution: Prefix Sum
Prefix Sum is effective for efficiently calculating interval sums.
Define the prefix sum array \(\text{prefix\_sum}\) as follows: - \(\text{prefix\_sum}[0] = 0\) - \(\text{prefix\_sum}[i] = T_1 + T_2 + \cdots + T_i\)
Then, the sum of interval \([L, R]\) can be computed in \(O(1)\) using the following formula: $\(T_L + T_{L+1} + \cdots + T_R = \text{prefix\_sum}[R] - \text{prefix\_sum}[L-1]\)$
Concrete Example
For \(T = [3, 1, 4, 1, 5]\): - \(\text{prefix\_sum} = [0, 3, 4, 8, 9, 14]\)
The total visiting time from area \(2\) to \(4\) is: $\(\text{prefix\_sum}[4] - \text{prefix\_sum}[1] = 9 - 3 = 6 = T_2 + T_3 + T_4 = 1 + 4 + 1\)$
Algorithm
- Preprocessing: Calculate the prefix sum \(\text{prefix\_sum}\) of array \(T\)
- Processing each query:
- Calculate the total visiting time as \(\text{prefix\_sum}[R] - \text{prefix\_sum}[L-1]\)
- Output end time \(= S + \text{total visiting time}\)
prefix_sum[0] = 0
for i = 1 to N:
prefix_sum[i] = prefix_sum[i-1] + T[i]
for each query (S, L, R):
total_time = prefix_sum[R] - prefix_sum[L-1]
answer = S + total_time
Complexity
- Time Complexity: \(O(N + M)\)
- \(O(N)\) for building the prefix sum
- \(O(1)\) × \(M\) queries = \(O(M)\) for processing queries
- Space Complexity: \(O(N)\)
- Size of the prefix sum array
Implementation Notes
- 1-indexed vs 0-indexed conversion: Since area numbers start from \(1\) in the problem statement, care must be taken with prefix sum indices.
prefix_sum[L-1]retrieves the sum up to just before the \(L\)-th element. - Overflow prevention: Since both \(T_i\) and \(S_j\) can be up to \(10^9\), and the interval length can be up to \(2 \times 10^5\), the answer can be approximately \(2 \times 10^{14}\) at maximum. In Python, there’s no need to worry about integer overflow, but in other languages, you need to use 64-bit integer types.
- Fast I/O: Using
sys.stdin.readlineand outputting results all at once reduces I/O overhead.
Source Code
import sys
def main():
input = sys.stdin.readline
N, M = map(int, input().split())
T = list(map(int, input().split()))
# Calculate prefix sum
prefix_sum = [0] * (N + 1)
for i in range(N):
prefix_sum[i + 1] = prefix_sum[i] + T[i]
results = []
for _ in range(M):
S, L, R = map(int, input().split())
# Total visiting time from area L to area R
total_time = prefix_sum[R] - prefix_sum[L - 1]
# End time = arrival time + visiting time
end_time = S + total_time
results.append(end_time)
print('\n'.join(map(str, results)))
if __name__ == "__main__":
main()
This editorial was generated by claude4.5opus.
posted:
last update: