sgu 180(树状数组)

点击打开链接


第一次在sgu上做题

题意:

给你n个数,求有多少组(i,j)  i<j&&a[i]>a[j];


树状数组+离散化。。。


#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
#define N 65555
typedef __int64 LL;
LL C[N];
struct node
{
	LL x,id;
}A[N];
bool cmp(node a,node b)
{
	return a.x<b.x;
}
LL bit(LL x)
{
	return x&(-x);
}
LL sum(LL x)
{
	LL ans=0;
	while(x)
	{
		ans+=(LL)C[x];
		x-=bit(x);
	}
	return ans;
}
void add(LL x,LL a)
{
	while(x<N)
	{
		C[x]+=a;
		x+=bit(x);
	}
}

int main()
{
	LL n;
	LL B[N];
	LL i;
	while(scanf("%I64d",&n)!=-1)
	{
		memset(C,0,sizeof(C));
		for(i=1;i<=n;i++)
		{
			scanf("%I64d",&A[i].x);
			A[i].id=i;
		}
		sort(A+1,A+n+1,cmp);
		LL t=1;
		B[A[1].id]=1;
		for(i=2;i<=n;i++)
		{
			if(A[i].x!=A[i-1].x)
				B[A[i].id]=++t;
			else B[A[i].id]=t;
		}
		
		//for(i=1;i<=n;i++)
		//	printf("%d ",B[i]);
			
		LL ans=0;
		for(i=n;i>=1;i--)
		{
			ans+=sum(B[i]-1);
			add(B[i],1);
		}
		printf("%I64d\n",ans);
	}
	return 0;
}


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