版权声明:最后一年,加油~ 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;
}