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;
}
这是入门啦,加油;