1538:清点人数

【题目描述】

NK 中学组织同学们去五云山寨参加社会实践活动,按惯例要乘坐火车去。由于 NK 中学的学生很多,在火车开之前必须清点好人数。

初始时,火车上没有学生。当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第 m 节车厢时,他想知道前 m 节车厢上一共有多少学生,但是他没有调头往回走的习惯。也就是说每次当他提问时,m 总会比前一次大。

【输入】

第一行两个整数 n,k,表示火车共有 n 节车厢以及 k 个事件。

接下来有 k 行,按时间先后给出 k 个事件,每行开头都有一个字母 A,B 或 C。

如果字母为 A,接下来是一个数 m,表示年级主任现在在第 m 节车厢;

如果字母为 B,接下来是两个数 m,p,表示在第 m 节车厢有 p 名学生上车;

如果字母为 C,接下来是两个数 m,p,表示在第 m 节车厢有 p 名学生下车。

学生总人数不会超过 105 。

【输出】

对于每个 A ,输出一行,一个整数,表示年级主任的问题的答案。

【输入样例】

10 7
A 1
B 1 1
B 3 1
B 4 1
A 2
A 3
A 10

【输出样例】

0
1
2
3

【提示】

数据范围与提示:

对于 30% 的数据,1≤n,k≤104 ,至少有 3000 个 A;

对于 100% 的数据,1≤n≤5×105,1≤k≤105 ,至少有 3×104 个 A。

裸的树状数组,读数据时cin铁定超时,换用scanf问题就来了,用getchar()读回车不知为何会错,看到别人的博客,读字符是scanf(" %c",&op);这样的,前面多一个空格,也能解决换行符问题,记一下.

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int n,k,sum[maxn];
void add(int p,int x){
	for(int i = p; i <= n; i += i & -i)
		sum[i]+=x;
}
int ask(int p){
	int ans=0;
	for( int i = p; i > 0; i -= i & -i)
		ans+=sum[i];
	return ans;
}
int main(){
	char op;
	int m,p;
	scanf("%d%d",&n,&k);
	for( int i = 0; i < k; i++ ){
		scanf(" %c",&op);
		if(op=='A'){
			scanf("%d",&m);
			printf("%d\n",ask(m));
		} 
		else if(op=='B'){
			scanf("%d%d",&m,&p);
			add(m,p);
		}
		else if(op=='C'){
			scanf("%d%d",&m,&p);
			add(m,-p);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值