#sZSZybttg040104. 1538:清点人数
1538:清点人数
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
NK 中学组织同学们去五云山寨参加社会实践活动,按惯例要乘坐火车去。由于 NK 中学的学生很多,在火车开之前必须清点好人数。
初始时,火车上没有学生。当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第 节车厢时,他想知道前 节车厢上一共有多少学生,但是他没有调头往回走的习惯。也就是说每次当他提问时, 总会比前一次大。
输入格式
第一行两个整数 ,表示火车共有 节车厢以及 个事件。
接下来 行,按时间先后给出 个事件,每行开头都有一个字母 A、B 或 C:
- 如果字母为
A,接下来是一个整数 ,表示年级主任现在在第 节车厢,需要输出前 节车厢的总人数; - 如果字母为
B,接下来是两个整数 ,表示在第 节车厢有 名学生上车; - 如果字母为
C,接下来是两个整数 ,表示在第 节车厢有 名学生下车。
保证学生总人数不会超过 。
输出格式
对于每个 A 事件,输出一行一个整数,表示前 节车厢的学生总数。
样例
样例输入
10 7
A 1
B 1 1
B 3 1
B 4 1
A 2
A 3
A 10
样例输出
0
1
2
3
样例解释
初始所有车厢人数为 。
A 1:询问前 节车厢人数,此时没有学生,输出 。B 1 1:在第 节车厢上车 人,第 节车厢人数变为 。B 3 1:在第 节车厢上车 人,第 节车厢人数变为 。B 4 1:在第 节车厢上车 人,第 节车厢人数变为 。A 2:询问前 节车厢人数,只有第 节有 人,输出 。A 3:询问前 节车厢人数,第 节 人,第 节 人,共 人,输出 。A 10:询问前 节车厢人数,第 节 人,第 节 人,第 节 人,共 人,输出 。
数据范围
- 对于 的数据,,至少有 个
A事件; - 对于 的数据,,至少有 个
A事件。
时空限制
- 时间:
- 内存:(512 MB)
提示
此题为 单点修改、前缀和查询 问题,由于 和 较大,需要 的修改与查询。
方法:使用 树状数组(Fenwick Tree) 维护每节车厢的人数,支持:
- 单点加/减(上车/下车);
- 前缀和查询(前 节车厢总人数)。
步骤:
- 初始化一个长度为 的树状数组(下标从 开始),全部为 ;
- 读入每个事件:
- 若为
B m p:在位置 加上 (add(m, p)); - 若为
C m p:在位置 减去 (add(m, -p)); - 若为
A m:输出前缀和sum(m)。
- 若为
- 由于询问的 单调递增,也可以直接维护前缀和变量,但因为有修改,不能简单累加,树状数组仍然必要。
复杂度:每个事件 ,总复杂度 ,可以接受。
注意:
- 题目保证
A事件的 单调递增,但这不是解题必要条件,树状数组本身支持任意顺序的查询; - 学生总人数不超过 ,但 可达 ,树状数组大小应为 ;
- 输入输出量较大,建议使用
scanf/printf或关闭同步的cin/cout。