• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
scorpiorax
博客园    首页    新随笔    联系   管理    订阅  订阅
vijos 清点人数

背景

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

描述

初始时,火车上没有学生;当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第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

提示

注意:对于30%的数据,n<=10000,k<=10000 至少有3000个A
对于100%的数据n<=500000,k<=100000. 至少有30000个A

 

*******树状数组,若是上车就是加,如果是下车就是减。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 int i,j,m,p,n,k,tree[500005] = {0},ans;
 7 char c;
 8 int lowbit(int q)
 9 {
10     return q & (-q);
11 }
12 void add(int q,int x)
13 {
14     while(q <= n)
15     {
16         tree[q] += x;
17         q += lowbit(q);
18     }
19 }
20 int chaxun(int q)
21 {
22     int res = 0;
23     while(q > 0)
24     {
25         res += tree[q];
26         q -= lowbit(q); 
27      } 
28      return res;
29 }
30 int main()
31 {
32     scanf("%d %d",&n,&k);
33     for(i = 1;i <= k;i++)
34     {
35         scanf("\n%c",&c);
36         if(c == 'A')
37         {
38             scanf("%d",&m);
39             ans = chaxun(m);
40             printf("%d\n",ans);
41         }
42         else if(c == 'B')
43         {
44             scanf("%d %d",&m,&p);
45             add(m,p);
46         }
47         else
48         {
49             scanf("%d %d",&m,&p);
50             p = -p;
51             add(m,p);
52         }
53      } 
54      return 0;
55 }

 

posted on 2018-09-04 13:14  scorpiorax  阅读(185)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3