Submission #1362638

#TimeUsernameProblemLanguageResultExecution timeMemory
1362638norrawichzzzMountains (NOI20_mountains)C++20
24 / 100
68 ms5136 KiB
#include <bits/stdc++.h>
using namespace std;

void update(int i, int k, vector<int> &fw) {
    while (i<(int)fw.size()) {
        fw[i] += k;
        i+=-i&i;
    }
}

int getsm(int i, vector<int> &fw) {
    int ans=0;
    while (i>0) {
        ans+=fw[i];
        i-=-i&i;
    }
    return ans;
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n;
    cin>> n;

    vector<int> a(n);
    for (int i=0; i<n; i++) cin>> a[i];
    
    vector<int> tem = a;
    sort(tem.begin(), tem.end());
    tem.erase(unique(tem.begin(), tem.end()), tem.end());
    
    for (int i=0; i<n; i++) {
        auto it = lower_bound(tem.begin(), tem.end(), a[i]);
        a[i] = it-tem.begin()+1;
    }

    vector<int> left(n+1, 0);
    
    vector<int> fw(n+1, 0);
    for (int i=0; i<n; i++) {
        update(a[i], 1, fw);
        left[i] = getsm(a[i]-1, fw);
    }
    for (int i=0; i<=n; i++) fw[i] = 0;

    long long ans = 0LL;
    for (int i=n-1; i>=0; i--) {
        update(a[i], 1, fw);
        ans += (long long)getsm(a[i]-1, fw) * (long long)left[i];
    }
    cout<< ans;

}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...