题意
求四元组(a,b,c,d)(a,b,c,d)(a,b,c,d),满足a<b;c<d;Sa<Sb;Sc>Sda<b;c<d;S_a<S_b;S_c>S_da<b;c<d;Sa<Sb;Sc>Sd,abcdabcdabcd不相等。
思路
若能相等,答案即顺序对∗*∗逆序对,否则考虑以下重复点的四种情况:
a=ca=ca=c
(a=c)<b,d(a=c)<b,d(a=c)<b,d且Sd<Sa=c<SbS_d<S_{a=c}<S_bSd<Sa=c<Sb
a=da=da=d
c<(a=d)<bc<(a=d)<bc<(a=d)<b且Sa=d<Sb,ScS_{a=d}<S_{b},S_cSa=d<Sb,Sc
b=cb=cb=c
a<(b=c)<da<(b=c)<da<(b=c)<d且Sb=c>Sa,dS_{b=c}>S_{a,d}Sb=c>Sa,d
b=db=db=d
a,c<(b=d)a,c<(b=d)a,c<(b=d)且Sa<Sb=d<ScS_a<S_{b=d}<S_cSa<Sb=d<Sc
用树状数组求解。(我真是超级无敌大傻逼,连逆序对都不会求)
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
int n;
long long ans, p, q;
long long t[100001], a[100001], b[100001], rs[100001], rb[100001], ls[100001], lb[100001];
void add(int x, int val) {
for (; x <= n; x += x & -x)
t[x] += val;
}
long long query(int x) {
long long res = 0;
for (; x; x -= x & -x)
res += t[x];
return res;
}
void init() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]), b[i] = a[i];
std::sort(b + 1, b + n + 1);
int m = std::unique(b + 1, b + n + 1) - b - 1;
for (int i = 1; i <= n; i++)
a[i] = std::lower_bound(b + 1, b + m + 1, a[i]) - b;
}
int main() {
init();
for (int i = n; i >= 1; i--)
p += rs[i] = query(a[i] - 1), rb[i] = query(n) - query(a[i]), add(a[i], 1);
memset(t, 0, sizeof(t));
for (int i = 1; i <= n; i++)
q += ls[i] = query(a[i] - 1), lb[i] = query(n) - query(a[i]), add(a[i], 1);
ans = p * q;
for (int i = 1; i <= n; i++)
ans -= rb[i] * rs[i] + rb[i] * lb[i] + rs[i] * ls[i] + lb[i] * ls[i];
printf("%lld", ans);
}