poj2299(离散化+树状数组)

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

#include<iostream>

#include<algorithm>

using namespace std;

struct node

{

	__int64 f,v;

}str[500000];

__int64 c[500000],n,t[500000];

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

{

	if(a.f<b.f)

		return 1;

	else

		return 0;

}

__int64 lowbit(__int64 x)

{

	return x&(-x);

}

__int64 sum(__int64 x)

{

	__int64 s=0;

	while(x>0)

	{

		s+=c[x];

		x-=lowbit(x);

	}

	return s;

}

void updata(__int64 i,__int64 j)

{

	while(i<=n)

	{

		c[i]+=j;

		i+=lowbit(i);

	}

}

int main()

{

	__int64 i,ans;

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

	{

		c[0]=0;

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

		{

			scanf("%d",&str[i].f);

			str[i].f++;

			str[i].v=i;

			c[i]=0;

		}

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

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

			t[str[i].v]=i;

		ans=0;

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

		{

			updata(t[i],1);

			ans+=i-sum(t[i]);

		}

		printf("%I64d\n",ans);

	}

	return 0;

}

 

你可能感兴趣的:(树状数组)