제출 #1085231

#제출 시각아이디문제언어결과실행 시간메모리
1085231eysbutnoUntitled (POI11_rot)C++17
100 / 100
436 ms36868 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template <class T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
 
int main() {
    int n; 
    cin >> n;
    int timer = 0;
    vector<ll> inversions(2 * n - 1);
    map<int, Tree<int>> sets;
    function<void(int)> dfs = [&](int idx) {
        assert(idx < (int) inversions.size());
        int val; 
        cin >> val;
        if (val == 0) {
            int idx_l = ++timer;
            dfs(idx_l);
            int idx_r = ++timer;
            dfs(idx_r);
            if (sets[idx_l].size() > sets[idx_r].size()) {
                sets[idx_l].swap(sets[idx_r]);
            }
            ll opt_1 = 0, opt_2 = 0;
            for (int v : sets[idx_l]) {
                int loc = sets[idx_r].order_of_key(v);
                opt_1 += loc;
                opt_2 += (int) sets[idx_r].size() - loc;
            }
            for (int v : sets[idx_l]) {
                sets[idx_r].insert(v);
            }
            inversions[idx] = inversions[idx_l] + inversions[idx_r] 
                            + min(opt_1, opt_2);
            sets[idx].swap(sets[idx_r]);
            sets.erase(idx_l);
            sets.erase(idx_r);
        } else {
            sets[idx].insert(val);
        }
    };
    dfs(0);
    cout << inversions[0] << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...