poj 2481

题意:FJ有n头牛(编号为1~n),每一头牛都有一个测验值[S, E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n,m;

struct e{
	int id,s,w;
};

e a[100011];

int cmp(const void *a,const void *b){
	e *s=(e*)a;
	e *t=(e*)b;
	if(s->s!=t->s)
		return s->s-t->s;
	else
		return t->w-s->w;
}

int b[100010];

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

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[100011];

void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0) return;
		memset(b,0,sizeof(b));
		m=0;
		for(i=1;i<=n;i++)
		{
		//	cin>>a[i].s>>a[i].w;
			scanf("%d%d",&a[i].s,&a[i].w);
			a[i].w++;
			a[i].s++;
			m=max(m,a[i].w);
			a[i].id=i;
		}
		qsort(a+1,n,sizeof(e),cmp);
		a[0].s=a[0].w=-1;
		for(i=1;i<=n;i++)
		{
			if(a[i].s==a[i-1].s&&a[i].w==a[i-1].w)
			{
				ans[a[i].id]=ans[a[i-1].id];
				add(a[i].w);
				continue;
			}
			j=getsum(m);
			
			j-=getsum(a[i].w-1);
			ans[a[i].id]=j;
			add(a[i].w);
		}
		for(i=1;i<=n;i++)
			cout<<ans[i]<<' ';
		cout<<endl;

	}

}

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

posted on 2011-05-13 18:58  宇宙吾心  阅读(789)  评论(0)    收藏  举报

导航