poj2352(树状数组)

树状数组基础与应用
本文详细介绍了树状数组的概念、实现方式以及如何利用树状数组解决实际问题,包括求和操作和更新操作。通过实例代码,深入浅出地解释了树状数组的使用方法,适合初学者和进阶开发者学习。

2011-08-08   20:01:28

第一道树状数组,赤裸裸的树状数组

题目大意看了半天啊,曾一度想找个学英语的给我翻一下,原来看题都没有觉得这么难理解

这里贴一个有翻译的链接:http://www.docin.com/p-270244818.html

其实这道题图的样子和树状数组的图的样子是一样的,都是求左边的和下面的之和,画个图或许可以帮助理解

 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 int c[32005];
 5 int lowbit(int x)
 6 {
 7     return x &(-x);
 8 }
 9 
10 int sum(int i)//前i项求和,从第一相开始求
11 {
12     int s=0;
13     while(i>0)
14     {
15         s=s+c[i];
16         i=i-lowbit(i);//从右往左加,注意看图
17     }
18     return s;
19 }
20 
21 void update(int i,int value)
22 {
23     while(i<=32005)
24     {
25         c[i]=c[i]+value;
26         i=i+lowbit(i);//从下往上更新,更新每一个点c[i],因为已经输入了一个点,所以在后面的点看来,左面或者下面已经有一个了
27     }
28 }
29 
30 int level[32005];
31 int main()
32 {
33     int Case;
34     //cin>>Case;
35     scanf("%d",&Case);
36     int x,y;
37     for(int i=0;i<Case;i++)
38     {
39         //cin>>x>>y;
40         scanf("%d%d",&x,&y);
41         int tmp=sum(++x);//这里是因为树状数组的下标是从1开始
42         level[tmp]++;
43         update(x,1);
44     }
45     for(int i=0;i<Case;i++)
46     {
47         //cout<<level[i]<<endl;
48         printf("%d\n",level[i]);
49     }
50     return 0;
51 }

转载于:https://www.cnblogs.com/devil-91/archive/2012/08/08/2628910.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值