传送门:5147
Sequence II
Problem Description
Long long ago, there is a sequence A with length n. All numbers in this sequence is no smaller than 1 and no bigger than n, and all numbers are different in this sequence.
Please calculate how many quad (a,b,c,d) satisfy:
1. 1≤a<b<c<d≤n
2. Aa<Ab
3. Ac<Ad
Please calculate how many quad (a,b,c,d) satisfy:
1. 1≤a<b<c<d≤n
2. Aa<Ab
3. Ac<Ad
Input
The first line contains a single integer T, indicating the number of test cases.
Each test case begins with a line contains an integer n.
The next line follows n integers A1,A2,…,An .
[Technical Specification]
1 <= T <= 100
1 <= n <= 50000
1 <= Ai <= n
Each test case begins with a line contains an integer n.
The next line follows n integers A1,A2,…,An .
[Technical Specification]
1 <= T <= 100
1 <= n <= 50000
1 <= Ai <= n
Output
For each case output one line contains a integer,the number of quad.
Sample Input
1 5 1 3 2 4 5
Sample Output
4
思路:树状数组求逆序数
/************************************************
* Author: Ac_sorry
* File:
* Create Date:
* Motto: One heart One life
* CSDN: http://blog.csdn.net/code_or_code
*************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<string>
#include<utility>
#include<map>
#include<set>
#include<queue>
#include<stack>
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define seed_ 131
#define eps 1e-8
#define mem(a,b) memset(a,b,sizeof a)
#define w(i) tree[i].w
#define ls(i) tree[i].ls
#define rs(i) tree[i].rs
using namespace std;
typedef long long LL;
const int N=50010;
int n;
int a[N],c[N];
LL rev_1[N],rev_2[N];
int lowbit(int x)
{
return -x&x;
}
void add(int x)
{
while(x<=n)
{
c[x]+=1;
x+=lowbit(x);
}
}
LL query(int x)
{
LL ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
mem(c,0);
mem(rev_1,0);
mem(rev_2,0);
scanf("%d",&n);
LL ans=0;
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",a+i);
add(a[i]);
rev_1[i]=query(n)-query(a[i]);
}
mem(c,0);
for(int i=n;i>=1;i--)
{
add(a[i]);
rev_2[i]=rev_2[i+1]+query(a[i]-1);
}
// for(int i=1;i<=n;i++)
// {
// printf("%I64d--%I64d\n",rev_1[i],rev_2[i]);
// }
for(int i=2;i<=n-2;i++)
{
ans+=((LL)i-1-rev_1[i])*((LL)(n-i)*(n-i-1)/2-rev_2[i+1]);
}
printf("%I64d\n",ans);
}
return 0;
}