Submission #1181902

#TimeUsernameProblemLanguageResultExecution timeMemory
1181902den1z19Mountains (NOI20_mountains)C++17
100 / 100
65 ms8520 KiB
#include "bits/stdc++.h"
using std::cout, std::cin, std::vector, std::string;
long long int left = 0, right = 0;
long long int n, tmp, count = 0;
long long int j, i, last = 0;
int indexx;

class FenwickTree {
private:
    vector<int> bit;
    int size;
    
public:
    FenwickTree(int n) {
        size = n;
        bit.assign(n + 1, 0);
    }
    
    void update(int idx, int val) {
        idx++; 
        while (idx <= size) {
            bit[idx] += val;
            idx += idx & -idx; 
        }
    }
    
    int query(int idx) {
        idx++; 
        int sum = 0;
        while (idx > 0) {
            sum += bit[idx];
            idx -= idx & -idx; 
        }
        return sum;
    }
    
    int countLessEqual(int idx) {
        return query(idx);
    }
    
    int insert(int element) {
        update(element, 1);
        return countLessEqual(element - 1);
    }
};

class FastSortedInsert {
private:
    FenwickTree ft;
    int maxSize;
    
public:
    FastSortedInsert(int maxSize = 200005) : ft(maxSize), maxSize(maxSize) {}
    
    int insert(int element) {
        return ft.insert(element);
    }
};

int insertSorted(vector<int>& freq, int value, int& multi) {
    freq[value]++;
    multi++;
    
    int position = 0;
    for (int i = 0; i < value; i++) {
        position += freq[i];
    }
    return position;
}

void solve() {
    cin >> n;
    FastSortedInsert si(n + 1);
    vector<std::pair<long long int, long long int>> h(n);
    std::vector<long long int> dp(n);
    
    for (long long int i = 0; i < n; i++) {
        cin >> h[i].first;
        h[i].second = i;
    }
    
    std::sort(h.begin(), h.end());
    int multi = 0;
    
    si.insert(h[0].second);
    multi++;
    si.insert(h[1].second);
    multi++;
    if (h[1].first != h[0].first) multi = 1;
    
    indexx = si.insert(h[2].second);
    multi++;
    if (h[2].first != h[1].first) multi = 1;
    
    left = std::max(0, indexx - multi + 1);
    right = 3 - multi - left;
    count = right * left;
    
    for (i = 3; i < n; i++) {
        left = right = 0;
        indexx = si.insert(h[i].second);
        multi++;
        if (h[i].first != h[i - 1].first) multi = 1;
        left = std::max(0, indexx - multi + 1);
        right = i + 1 - multi - left;
        count += right * left;
    }
    
    cout << count << '\n';
}

int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr);
    unsigned long long ct = 1;
    // cin >> ct;
    while (ct--) solve();
}
#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...