poj 2352(树状数组)

题意:按y递增的顺序给出n颗星星的坐标(y相等则x递增),每个星星的等级,等于在它左边且在它下边(包括水平和垂直方向)的星星的数量,求出等级为0到n-1的星星分别有多少个。

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n,m;

struct e{
	int s,t;
};

e a[15001];
int b[32020];

int lowbit(int x){
	return x&(-x);
}

void add(int s){
	while(s<=m)
	{
		b[s]++;
		s+=lowbit(s);
	}
}

int getsum(int s){
	int i=0;
	while(s>0)
	{
		i+=b[s];
		s-=lowbit(s);
	}
	return i;
}

int ans[15001];

void read(){
//	ifstream cin("in.txt");
	int i,j,k;
//	cin>>n;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
//		cin>>a[i].s>>a[i].t;
		scanf("%d%d",&a[i].s,&a[i].t);
		a[i].s++;
		a[i].t++;
		m=max(m,a[i].s);
	}
	
	for(i=1;i<=n;i++)
	{
		j=getsum(a[i].s);
		ans[j]++;
		add(a[i].s);
	}
	for(i=0;i<n;i++)
		cout<<ans[i]<<endl;
	
}

int main(){
	read();
	return 0;
}

posted on 2011-05-13 19:17  宇宙吾心  阅读(323)  评论(0)    收藏  举报

导航