清点人数-树状数组

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

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

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

output:
有多少个A就输出多少个数,回答年级主任提出的问题。输出不要换行!

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

output:
0
1
2
3

【参考程序】://树状数组
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
long c[500001];
long
n,k;
long lowbit(long
x)
{

    return x^(x&(x-1
));
}

void modify(long x,long
d)
{

    while (x<=
n)
    {

        c[x]+=d
;
        x
+=lowbit
(x);
    }

}
long getsum(long
x)
{

    long s=0
;
   
while
(x)
    {

        s+=c[x];
        x-=lowbit
(x);
    }

    return
s;
}

int
main()
{

    scanf("%d%d",&n,&k
);
    getchar();
    memset(c
,0,sizeof
(c));
   
long
x,y;
   
char
c;
   
for (int i=1;i<=k;i++
)
    {

        scanf("%c",&c
);

       
if (c=='A'
)
        {

            scanf("%d",&x
);
            getchar();
            printf(
"%d",getsum
(x));
        }

        else if (c=='B'
)
        {

            scanf("%d%d",&x,&y
);
            getchar();
            modify(x,y);
        }

        else
        {
            scanf("%d%d",&x,&y
);
            getchar();
            modify(x
,-y
);
        }

    }
    system("pause"
);
   
return 0
;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值