A - 成績管理システム / Grade Management System 解説 by admin
Claude 4.6 Opus (Thinking)Overview
This problem requires managing scores of \(N\) students and processing three types of queries: transferring scores, counting comparisons within a range, and adding points to a range simultaneously. Since the constraints are small with \(N, Q \leq 5000\), this can be solved with a straightforward simulation.
Analysis
First, let’s check the constraints: \(N \leq 5000\), \(Q \leq 5000\).
Let’s consider the worst-case computational complexity for each query:
- Type 1 (Score transfer): Simply updating the scores of two students, so \(O(1)\).
- Type 2 (Comparison query): Comparing each student in the interval \([l, r]\) against a reference value, so worst case \(O(N)\).
- Type 3 (Batch score addition): Adding a score to each student in the interval \([l, r]\), so worst case \(O(N)\).
The overall time complexity is \(O(NQ)\) in the worst case, which is approximately \(5000 \times 5000 = 25{,}000{,}000\) (25 million). This is well within the range that runs fast enough, so we can solve this with a straightforward approach that directly manipulates an array without using any special data structures.
If \(N\) or \(Q\) were much larger (e.g., \(10^5\) or more), advanced data structures like segment trees or BITs would be needed, but they are not necessary under the current constraints.
Algorithm
- Prepare an array
scoreof length \(N+1\), initialized entirely to \(0\) (managed with 1-indexed access). - Process each query in order:
- Type 1 (
1 a b v): Executescore[a] -= vandscore[b] += v. - Type 2 (
2 x l r): Usingscore[x]as the reference value, count the number of indices \(i = l, l+1, \dots, r\) wherescore[i] > base. - Type 3 (
3 l r v): Executescore[i] += vfor \(i = l, l+1, \dots, r\).
- Type 1 (
- Output the results of Type 2 queries in order.
Concrete Example
For example, with \(N=3\) and scores [0, 0, 0] (students 1 through 3):
- Query
1 1 2 5→ Scores become[-5, 5, 0] - Query
3 1 3 3→ Scores become[-2, 8, 3] - Query
2 3 1 3→ The reference value isscore[3] = 3. In the interval \([1, 3]\), the only student with a score greater than \(3\) is student 2 (score \(8\)) → Output1
Complexity
- Time complexity: \(O(NQ)\) (worst case \(O(N)\) traversal per query, repeated \(Q\) times)
- Space complexity: \(O(N)\) (for managing the score array)
Implementation Notes
Since the absolute value of scores can reach up to \(10^{13}\), in C++ and similar languages you need to use
long long. In Python, there is no need to worry about integer overflow.Note that the argument order differs between Type 2 and Type 3 queries (Type 2 is
x l r, while Type 3 isl r v). The problem statement also includes a note about this.Output is performed all at once to reduce I/O overhead (outputting collectively using
sys.stdout.write).Source Code
import sys
input = sys.stdin.readline
def main():
N, Q = map(int, input().split())
score = [0] * (N + 1) # 1-indexed
results = []
for _ in range(Q):
query = list(map(int, input().split()))
t = query[0]
if t == 1:
a, b, v = query[1], query[2], query[3]
score[a] -= v
score[b] += v
elif t == 2:
x, l, r = query[1], query[2], query[3]
base = score[x]
count = 0
for i in range(l, r + 1):
if score[i] > base:
count += 1
results.append(count)
else: # t == 3
l, r, v = query[1], query[2], query[3]
for i in range(l, r + 1):
score[i] += v
sys.stdout.write('\n'.join(map(str, results)) + '\n' if results else '')
main()
This editorial was generated by claude4.6opus-thinking.
投稿日時:
最終更新: