poj2481

http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10588

思路:先对E进行降序排序,在E相等的情况下,对S进行升序排序。然后用树状数组统计即可

#include<iostream>

#include<algorithm>

using namespace std;

struct node 

{

	int s,e,k;

}t[100005];

int c[100005];

int cmp(const node &a,const node &b)

{

	if(b.e<a.e)

		return 1;

	else

		if(b.e==a.e&&b.s>a.s)

			return 1;

		else

			return 0;

}

int lowbit(int x)

{

	return x&(-x);

}

int sum(int x)

{

	int s=0;

	while(x>0)

	{

		s+=c[x];

		x-=lowbit(x);

	}

	return s;

}

void updata(int i,int j)

{

	while(i<=100004)

	{

		c[i]+=j;

		i+=lowbit(i);

	}

}

int main()

{

	int i,rel[100005],n;

	while(scanf("%d",&n)>0)

	{

		if(n<1)

			break;

		memset(c,0,sizeof(c));

		for(i=1;i<=n;i++)

		{

			scanf("%d %d",&t[i].s,&t[i].e);

			t[i].s++,t[i].e++;

			t[i].k=i;

		}

		sort(t+1,t+1+n,cmp);

		i=1;

		rel[t[i].k]=sum(t[i].s);

		updata(t[i].s,1);

		for(i=2;i<=n;i++)

		{

			if(t[i].s==t[i-1].s&&t[i].e==t[i-1].e)

				rel[t[i].k]=rel[t[i-1].k];

			else

				rel[t[i].k]=sum(t[i].s);

			updata(t[i].s,1);

		}

		for(i=1;i<n;i++)

			printf("%d ",rel[i]);

		printf("%d\n",rel[i]);

	}

	return 0;

}

 

你可能感兴趣的:(poj)