hdu 2492 树状数组

/*

	无知的YY:

	          树状数组就是能对>x的所有值进行操作,

			  可以是加上一个v(即,求SUM(int x))

			  也可以对其进行标记(即,每个出现过的进行记录,此题就是,比较典型)

*/





#include <stdio.h>

#include <string.h>

int s[100001],flag[100001];

int lmin[100001],lmax[100001],rmin[100001],rmax[100001];



int SUM(int x)

{

	int ss=0;

	for(int i=x;i>0;i-=i&-i)

		ss+=flag[i];

	return ss;

}

void update(int x)

{

	for(int i=x;i<=100000;i+=i&-i)

		flag[i]++;

}



int main()

{

	int i,j,n,m,cas;

	__int64 sum;

	scanf("%d",&cas);

	while(cas--)

	{

		scanf("%d",&n);

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

		{

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

		}

		memset(flag,0,sizeof(flag));

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

		{

			lmin[i]=SUM(s[i]);

			lmax[i]=i-1-lmin[i];

			update(s[i]);

		}

		memset(flag,0,sizeof(flag));

		for(i=n,j=1;i>0;j++,i--)

		{

			rmin[i]=SUM(s[i]);

			rmax[i]=j-1-rmin[i];

			update(s[i]);

		}

		sum=0;

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

			sum+=lmin[i]*rmax[i]+lmax[i]*rmin[i];

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

	}

	return 0;

}

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