poj-3928 Ping pong

版权声明:最后一年,加油~ https://blog.csdn.net/zzti_xiaowei/article/details/81044855

[题目链接]

思路:很简单的一道树状数组题,和逆序数很像。但是他喵Each player has a unique skill rank.这个没看到,一直在考虑相同等级的情况,凉凉~~
思路emmm….还是不说了,还是先做逆序数这道题,然后看这题,感觉你就会秒懂,相信自己完全ojbk。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int Max_n=1e5+10;

int t,n;
int a[Max_n],c1[Max_n],c2[Max_n];
ll s1[Max_n],s2[Max_n];

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

void update(int k,int *c){
    while(k<=Max_n){
        c[k]+=1;
        k+=lowbit(k);
    }
}

ll query(int k,int *c){
    ll ans=0;
    while(k>0){
        ans+=c[k];
        k-=lowbit(k);
    }
    return ans;
}

int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(int i=1;i<=n;i++){
            s1[i]=query(a[i],c1);
            update(a[i],c1);
        }
        for(int i=n;i>=1;i--){
            s2[i]=query(a[i],c2);
            update(a[i],c2);
        }
        ll sum=0;
        for(int i=1;i<=n;i++)
            sum=sum+s1[i]*(n-i-s2[i])+(i-1-s1[i])*s2[i];
        printf("%lld\n",sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/81044855