分成前后两段,利用树状数组去遍历一遍,就可以了
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<math.h>
#include<stack>
using namespace std;
#define LL long long
#define mp(a,b) make_pair((a),(b))
#define clr(x,a) memset(x,a,sizeof(x))
#define INF 0x3f3f3f3f
#define lb(x) ((x)&(-x))
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int N=1005,siz=1e9;
const int MOD=1e9+7;
int n;
int a[50005];
int b[50100],c[50100];
int query1(int x){
int ans=0;
for(int i=x-1;i>0;i-=(i&-i)){
ans+=b[i];
}
return ans;
}
int query2(int x){
int ans=0;
for(int i=x-1;i>0;i-=(i&-i)){
ans+=c[i];
}
return ans;
}
void add1(int x){
for(int i=x;i<=n;i+=(i&-i)){
b[i]++;
}
}
void add2(int x){
for(int i=x;i<=n;i+=(i&-i)){
c[i]++;
}
}
void del2(int x){
for(int i=x;i<=n;i+=(i&-i)){
c[i]--;
}
}
int main()
{
//freopen("aaa.txt","r",stdin);
//freopen("bbb.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
if(n<4) {
puts("0");
continue;
}
clr(b,0);
clr(c,0);
int fir=0,se=0;
add1(a[1]);
fir+=query1(a[2]);
add1(a[2]);
add2(a[3]);
for(int i=4;i<=n;i++){
se+=query2(a[i]);
add2(a[i]);
}
LL ans=0;
int index=3;
ans+=(LL)fir*se;
//cout<<fir<<" "<<se<<endl;
while(n-index>=2){
//ans+=(LL)fir*se;
fir=query1(a[index]);
add1(a[index]);
int temp=query2(n+1)-query2(a[index]+1);
del2(a[index]);
se-=temp;
//cout<<fir<<" "<<se<<endl;
//cout<<index<<endl;
ans+=(LL)fir*se;
index++;
}
printf("%I64d\n",ans);
}
return 0;
}
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<math.h>
#include<stack>
using namespace std;
#define LL long long
#define mp(a,b) make_pair((a),(b))
#define clr(x,a) memset(x,a,sizeof(x))
#define INF 0x3f3f3f3f
#define lb(x) ((x)&(-x))
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int N=1005,siz=1e9;
const int MOD=1e9+7;
int n;
int a[50005];
int b[50100],c[50100];
int query1(int x){
int ans=0;
for(int i=x-1;i>0;i-=(i&-i)){
ans+=b[i];
}
return ans;
}
int query2(int x){
int ans=0;
for(int i=x-1;i>0;i-=(i&-i)){
ans+=c[i];
}
return ans;
}
void add1(int x){
for(int i=x;i<=n;i+=(i&-i)){
b[i]++;
}
}
void add2(int x){
for(int i=x;i<=n;i+=(i&-i)){
c[i]++;
}
}
void del2(int x){
for(int i=x;i<=n;i+=(i&-i)){
c[i]--;
}
}
int main()
{
//freopen("aaa.txt","r",stdin);
//freopen("bbb.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
if(n<4) {
puts("0");
continue;
}
clr(b,0);
clr(c,0);
int fir=0,se=0;
add1(a[1]);
fir+=query1(a[2]);
add1(a[2]);
add2(a[3]);
for(int i=4;i<=n;i++){
se+=query2(a[i]);
add2(a[i]);
}
LL ans=0;
int index=3;
ans+=(LL)fir*se;
//cout<<fir<<" "<<se<<endl;
while(n-index>=2){
//ans+=(LL)fir*se;
fir=query1(a[index]);
add1(a[index]);
int temp=query2(n+1)-query2(a[index]+1);
del2(a[index]);
se-=temp;
//cout<<fir<<" "<<se<<endl;
//cout<<index<<endl;
ans+=(LL)fir*se;
index++;
}
printf("%I64d\n",ans);
}
return 0;
}