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;
}
posted @ 2010-11-24 22:47  kfinder  阅读(478)  评论(0编辑  收藏  举报