Problem Description
Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies:
a≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>Ad
.
Input
The input consists of multiple test cases.
Each test case begin with an integer n in a single line.
The next line contains n integers A1,A2⋯An .
1≤n≤50000
0≤Ai≤1e9
Each test case begin with an integer n in a single line.
The next line contains n integers A1,A2⋯An .
1≤n≤50000
0≤Ai≤1e9
Output
For each test case,output a line contains an integer.
Sample Input
4 2 4 1 3 4 1 2 3 4
Sample Output
1 0
一开始看错题了...然后又不小心取模计算了...各种挂
容易想到的是枚举b的位置
然后b1表示左边比它小的,b2表示右边比它小的,b3表示左边比它大的
sx表示一共可以选的cd总数
然后统计的时候假设当前是ai
那么我们只需要用(sx-b2[i]-b3[i])*b1[i]-左侧比它小的数在c的情况
最后那个可以用树状数组直接维护
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct number
{
int x,p;
}a[100001];
inline bool cmp1(number x,number y)
{
return x.x<y.x;
}
inline bool cmp2(number x,number y)
{
return x.p<y.p;
}
int tr[100001];
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int l,int x)
{
int i;
for(i=l;i<=100000;i+=lowbit(i))
tr[i]=(tr[i]+x);
}
inline int sum(int x)
{
int i;
int sx=0;
for(i=x;i>=1;i-=lowbit(i))
sx+=tr[i];
return sx;
}
int f[100001],fx[100001];
long long b1[100001],b2[100001],b3[100001],b4[100001];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
a[i].p=i;
}
sort(a+1,a+1+n,cmp1);
int tot=1;
f[tot]=a[1].x;
fx[a[1].p]=tot;
for(i=2;i<=n;i++)
{
if(a[i].x==a[i-1].x)
fx[a[i].p]=tot;
else
{
tot++;
f[tot]=a[i].x;
fx[a[i].p]=tot;
}
}
memset(b1,0,sizeof(b1));
memset(b2,0,sizeof(b2));
memset(b3,0,sizeof(b2));
memset(tr,0,sizeof(tr));
sort(a+1,a+1+n,cmp2);
for(i=1;i<=n;i++)
{
b1[i]=sum(fx[i]-1);
add(fx[i],1);
}
memset(tr,0,sizeof(tr));
long long sx=0;
for(i=n;i>=1;i--)
{
b2[i]=sum(fx[i]-1);
sx=(sx+b2[i]);
add(fx[i],1);
}
memset(tr,0,sizeof(tr));
for(i=1;i<=n;i++)
{
b3[i]=sum(n)-sum(fx[i]);
add(fx[i],1);
}
sort(a+1,a+1+n,cmp1);
long long ans=0;
memset(tr,0,sizeof(tr));
for(i=1;i<=n;i++)
{
add(fx[i],b2[i]+b3[i]);
long long tmp=sx-b3[i]-b2[i];
long long tx=sum(fx[i]-1);
ans=(ans+b1[i]*tmp-tx);
}
printf("%I64d\n",ans);
}
return 0;
}