https://cn.vjudge.net/contest/158362#problem/M
好老的题,计算一下总的上升与下降个数乘起来减去不合法的即可
#include<stdio.h>
#include<algorithm>
using namespace std;
#define For(i,a,b) for (int i=a;i<=b;i++)
typedef long long ll;
#define N 50005
#define se second
#define fi first
pair<int,int> p[N];
int n,k,a[N],t[N],pre_lo[N],pre_hi[N],suf_lo[N],suf_hi[N];
inline void add(int x){for (;x<=n;x+=x&-x) t[x]++;}
inline int find(int x)
{
int rt=0;
for (;x;x-=x&-x) rt+=t[x];
return rt;
}
int main()
{
p[0].fi=-1;
while (~scanf("%d",&n))
{
For(i,1,n) scanf("%d",&k),p[i]=make_pair(k,i);
sort(p+1,p+n+1);
For(i,1,n) a[p[i].se]=a[p[i-1].se]+(p[i].fi!=p[i-1].fi);
For(i,1,n) t[i]=0;
For(i,1,n) add(a[i]),pre_lo[i]=find(a[i]-1),pre_hi[i]=i-find(a[i]);
For(i,1,n) t[i]=0;
for (int i=n;i;i--) suf_lo[i]=find(a[i]-1),suf_hi[i]=n-i-find(a[i]),add(a[i]);
ll sum_hi=0,sum_lo=0;
For(i,1,n) sum_hi+=pre_hi[i],sum_lo+=pre_lo[i];
ll ans=sum_hi*sum_lo;
for (int i=1;i<=n;i++)
{
ans-=(ll)pre_lo[i]*suf_lo[i];
ans-=(ll)pre_hi[i]*suf_hi[i];
ans-=(ll)pre_lo[i]*pre_hi[i];
ans-=(ll)suf_lo[i]*suf_hi[i];
}
printf("%I64d\n",ans);
}
}