#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int> tree;
int cfr = 1;
int sum(int a, int b){
a += cfr;
b += cfr;
int s = 0;
while (a <= b){
if (a%2 == 1){
s += tree[a++];
}
if (b%2 == 0){
s += tree[b--];
}
a /= 2;
b /= 2;
}
return s;
}
void update(int k, int x){
k += cfr;
tree[k] += x;
k /= 2;
while (k >= 1){
tree[k] = tree[2*k] + tree[2*k+1];
k /= 2;
}
}
signed main() {
int n;
cin >> n;
pair<int,int> arr[n];
for (int i = 0; i<n; i++){
int a;
cin >> a;
arr[i] = {a,i};
}
sort(arr,arr+n);
vector<int> nw(n);
for (int i = 0; i<n; i++){
if (i == 0){
nw[arr[i].second] = cfr;
}
else if (arr[i].first == arr[i-1].first){
nw[arr[i].second] = cfr;
}
else{
nw[arr[i].second] = ++cfr;
}
}
cfr++;
vector<int> a(cfr);
while (__builtin_popcount(cfr) != 1){
a.push_back(0);
cfr++;
}
tree.resize(2*cfr);
vector<int> lft(n), rgt(n);
for (int i = 0; i<n; i++){
lft[i] = sum(0,nw[i]-1);
update(nw[i],1);
}
tree.clear();
tree.resize(2*cfr);
for (int i = n-1; i>=0; i--){
rgt[i] = sum(0,nw[i]-1);
update(nw[i],1);
}
int ans = 0;
for (int i = 0; i<n; i++){
ans += lft[i]*rgt[i];
}
cout << ans << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |