POJStars2352(树状数组学习)

来源:互联网 发布:datagridview刷新数据 编辑:程序博客网 时间:2024/05/09 09:18

POJStars2352(树状数组)
这个题意这的是太令人难懂哈,为了学习树状数组只有硬着头皮搞了,树状数组是一个tree数组记录了和的所有数组,不过不是从起点开始的,要求从起点开始的还得调用一个get()函数,见图:
这里写图片描述
这个图上的这个横条就是各个tree的值,get函数的原理就是黑线画的这样了。
之后再更新:
用add
这里写图片描述
这个图是包括这个节点的所有tree数组,所以这个都要加一个这个值了。

我的:

#include<iostream>#include<string>#include<cstdio>#include<cmath>#include<map>#include<algorithm>#include<cstring>using namespace std;const int maxn=32000+10;#define PI acos(-1.0)int tree[maxn];inline int lowbit(int x){    return x&(-x);}void add(int x,int value)//更新操作,对各个tree数组{    for(int i=x;i<=maxn;i+=lowbit(i))    {        tree[i]+=value;    }}int get(int x)//得出各个从原点到这个节点的sum{    int sum=0;    for(int i=x;i>0;i-=lowbit(i))    {        sum+=tree[i];    }    return sum;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        int cnt[maxn];        memset(cnt,0,sizeof(cnt));        memset(tree,0,sizeof(tree));        for(int i=0;i<n;i++)        {            int x,y;            scanf("%d%d",&x,&y);            int sum=get(x+1);//防止出现x为0的情况            cnt[sum]++;//cnt数组记录的事不同sum所出现的次数            add(x+1,1);        }        for(int i=0;i<n;i++)        {            cout<<cnt[i]<<endl;        }    }    return 0;}

这是入门啦,加油;

0 0
原创粉丝点击