제출 #892915

#제출 시각아이디문제언어결과실행 시간메모리
892915votranngocvyMountains (NOI20_mountains)C++14
100 / 100
115 ms18740 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
const int N = 3e5 + 5;
int n,a[N],bit[N],f[N];

void compress() {
    vector<pii>vec;
    for (int i = 1; i <= n; i++) vec.push_back(mp(a[i],i));
    sort(vec.begin(),vec.end());
    a[vec[0].se] = 1;
    for (int i = 1; i < n; i++)
        if (vec[i].fi == vec[i - 1].fi) a[vec[i].se] = a[vec[i - 1].se];
        else a[vec[i].se] = i + 1;
}

void update(int i,int x) {
    for (; i < N; i += i & (-i)) bit[i] += x;
}

int get(int i) {
    int ans = 0;
    for (; i > 0; i -= i & (-i)) ans += bit[i];
    return ans;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    compress();
    for (int i = 1; i <= n; i++) {
        f[i] = get(a[i] - 1);
        update(a[i],1);
    }
    memset(bit,0,sizeof(bit));
    int ans = 0;
    for (int i = n; i > 0; i--) {
        ans += get(a[i] - 1) * f[i];
        update(a[i],1);
    }
    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...