【Vijos1320】清点人数

描述

初始时,火车上没有学生;当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第m节车厢时,他想知道第1到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名学生下车。学生总人数不会超过100000。

输出格式

有多少个A就输出多少行,每行一个整数,回答年级主任提出的问题。

样例1

样例输入1

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

Copy

样例输出1

0
1
2
3

Copy

限制

各个测试点1s

解析:

       树状数组裸题。。。

代码:

#include <bits/stdc++.h>
using namespace std;

const int Max=500010;
int n,m,k;
int sum[Max];

inline int get_int()
{
	int x=0,f=1;
	char c;
	for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
	if(c=='-') {f=-1;c=getchar();}
	for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
	return x*f;
}

inline int lowbit(int x){return x&-x;}
inline void add(int pos,int x){for(;pos<=n;pos+=lowbit(pos)) sum[pos]+=x;}
inline int Q(int pos)
{
	int ans=0;
	for(;pos;pos-=lowbit(pos)) ans+=sum[pos];
	return ans;
}

int main()
{
	n=get_int(),m=get_int();
	for(int i=1;i<=m;i++)
	{
	  char ch=getchar();
	  if(ch == 'A')
	  {
	  	int x=get_int();
	    cout<<Q(x)<<"\n";
	  }
	  else
	  {
	  	int x=get_int(),y=get_int();
	  	if(ch == 'B') add(x,y);
	  	else add(x,-y);
	  }
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_38083668/article/details/81487749