Submission #1321695

#TimeUsernameProblemLanguageResultExecution timeMemory
1321695m0rtu_us0512Mountains (NOI20_mountains)C++20
100 / 100
350 ms35648 KiB
#include <bits/stdc++.h>

using namespace std;


struct BIT{
    int64_t N ;
    vector<int64_t> x ;

    void reset(int64_t size){
        N = size ;
        x.assign(N+1, 0) ;
    }

    // 1 <= i <= N
    void add(int64_t i, int64_t v=1){
        for( ; i<=N ; i+=i&-i )
            x[i] += v ;
    }

    // sum(x[1~i])
    auto get(int64_t i){
        int64_t s = 0 ;
        for( ; i ; i-=i&-i )
            s += x[i] ;
        return s ;
    }
} ;


int64_t N ;
map<int64_t,vector<int64_t>> H ;


int main(){
    ios_base::sync_with_stdio(0) ;
    cin.tie(0) ;

    cin >> N ;
    for( int64_t i=1 ; i<=N ; i++ ){
        int64_t h ;
        cin >> h ;

        if( H.find(h) == H.end() )
            H[h] = {i} ;
        else
            H[h].push_back(i) ;
    }

    BIT bit ;
    bit.reset(N) ;

    int64_t ans = 0 ;

    for( auto [h,x] : H ){
        // cout << h << ":";

        for( auto &xx : x ){
            // cout << setw(2) << xx ;

            auto L = bit.get(xx) ;
            auto R = bit.get(N) - L ;
            ans += L*R ;
        }

        for( auto &xx : x )
            bit.add(xx, 1) ;

        // cout << endl ;
    }

    cout << ans << endl ;

    return 0 ;
}
#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...