#include<bits/stdc++.h>
#define ls(x) (x * 2)
#define rs(x) (x * 2 + 1)
#define int long long
using namespace std;
const int N = 1e5 + 5;
int tree[N], a[N], n, m, p[N], ans, lt[N], rt[N];
void update(int root)
{
tree[root] = tree[ls(root)] + tree[rs(root)];
}
void lazy(int lt, int rt, int root)
{
if(p[root])
{
p[ls(root)] += p[root];
p[rs(root)] += p[root];
int mid = (lt + rt) / 2;
tree[ls(root)] += (mid - lt + 1) * p[root];
tree[rs(root)] += (rt - (mid + 1) + 1) * p[root];
p[root] = 0;
}
return ;
}
void add(int lt, int rt, int root, int x, int y, int k)
{
if(x <= lt && y >= rt)
{
tree[root] += (rt - lt + 1) * k;
p[root] += k;
return ;
}
lazy(lt, rt, root);
int mid = (lt + rt) / 2;
if(x <= mid) add(lt, mid, ls(root), x, y, k);
if(y > mid) add(mid + 1, rt, rs(root), x, y, k);
update(root);
return ;
}
int get(int lt, int rt, int root, int x, int y)
{
if(x <= lt && y >= rt)
return tree[root];
lazy(lt, rt, root);
int mid = (lt + rt) / 2;
int num = 0;
if(x <= mid) num += get(lt, mid, ls(root), x, y);
if(y > mid) num += get(mid + 1, rt, rs(root), x, y);
return num;
}
signed main()
{
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= n; i++)
{
if(a[i] > 1)
lt[i] = get(1, n, 1, 1, a[i] - 1);
add(1, n, 1, a[i], a[i], 1);
}
memset(tree, 0, sizeof tree);
for(int i = n; i >= 1; i--)
{
if(a[i] < 100000)
rt[i] = get(1, n, 1, a[i] + 1, 100000);
add(1, n, 1, a[i], a[i], 1);
}
for(int i = 1; i <= n; i++)
ans += lt[i] * rt[i];
cout << ans;
return 0;
}
自己调吐了,求大佬相助QWQ