题目:
题解:
树状数组
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
long long a[N];
long long t[N];
long long bigger[N],lower[N];
int n;
void add(long long x, long long k)
{
for(; x <= n; x += x & -x) t[x] += k;
}
long long ask(long long x)
{
long long ans=0;
for(; x; x -= x & -x) ans += t[x];
return ans;
}
int main()
{
cin>>n;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
for(int i = 1; i <= n; i ++ )
{
long long y = a[i];
lower[i] = ask(y - 1);
bigger[i] = ask(n) - ask(y);
add(y, 1);
}
long long ans1 = 0, ans2 = 0;
memset(t, 0, sizeof t);
for(int i = n; i >= 1; i--)
{
long long y = a[i];
ans1 += (long long) lower[i] * ask(y - 1);
ans2 += (long long) bigger[i] * (ask(n) - ask(y));
add(y, 1);
}
cout << ans2 << " " << ans1 << endl;
return 0;
}