LA 4329 乒乓比赛(树状数组+计数原理)

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;

int num[maxn],n,a[maxn],c[maxn],d[maxn];

int lowbit(int x){
	return x&(-x);
}

int sum(int x){
	int ret=0;
	while(x>0){
		ret+=a[x];
		x-=lowbit(x);
	}
	return ret;
}

void add(int x,int d){
	while(x<=100010){
		a[x]+=d;
		x+=lowbit(x);
	}
}
void init()
{
    memset(c, 0, sizeof(c));
    memset(d, 0, sizeof(d));
    memset(a, 0, sizeof(a));
}
int main(){
	 int t;
    scanf("%d",&t);
    while(t--)
    {
        init();
        scanf("%d",&n);
        for(int i = 1; i <= n; i++)
        {
            scanf("%d",&num[i]);
            add(num[i], 1);
            c[i] = sum(num[i]-1);
        }
        memset(a, 0, sizeof(a));
        for(int i = n; i >= 1; i--)
        {
            add(num[i], 1);
            d[i] = sum(num[i]-1);
        }
        long long sum = 0;
        for(int i = 1; i <= n; i++)
            sum += c[i]*(n-i-d[i])+(i-c[i]-1)*d[i];
        printf("%lld\n",sum);
    }
    return 0;
		
} 

 

发布了57 篇原创文章 · 获赞 58 · 访问量 622

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103898986