码迷,mamicode.com
首页 > 其他好文 > 详细

vijos 1320 清点人数

时间:2017-09-26 19:29:57      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:上下   实践   注意   接下来   https   点击   owb   ==   class   

背景

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

样例输出1

0
1
2
3

限制

各个测试点1s

提示

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

来源

命题:cauchy

审题:彩虹阴影
数据:彩虹阴影

 

树状数组

屠龙宝刀点击就送

#include <cstdio>
#define N 500005
int tag[N],n,k;
inline int lowbit(int x){return x&(-x);}
inline int ask(int x)
{
    int ret=0;
    for(;x;x-=lowbit(x)) ret+=tag[x];
    return ret;
}
inline void modify(int x,int y) {for(;x<=n;x+=lowbit(x)) tag[x]+=y;}
int Main()
{
    scanf("%d%d",&n,&k);
    char str[5];
    for(int m,p;k--;)
    {
        scanf("%s%d",str+1,&m);
        if(str[1]==A) printf("%d\n",ask(m));
        else 
        {
            scanf("%d",&p);
            if(str[1]==B) modify(m,p);
            else modify(m,-p);
        }
    }
    return 0;
}
int sb=Main();
int main(int argc,char *argv[]){;}

 

vijos 1320 清点人数

标签:上下   实践   注意   接下来   https   点击   owb   ==   class   

原文地址:http://www.cnblogs.com/ruojisun/p/7597943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!