Submission #1121186

#TimeUsernameProblemLanguageResultExecution timeMemory
1121186tab1540무제 (POI11_rot)C++17
45 / 100
140 ms65536 KiB
#include <iostream>
#include <vector>

using namespace std;

struct sparseSeg {
    vector<pair<int, pair<int, int>>> segtre;
    
    sparseSeg() {
        segtre.push_back({0, {0, 0}});
    }

    void fix(int l, int r, int index) {
        if (l < r) {
            if (segtre[index].second.first == 0) {
                segtre[index].second.first = segtre.size();
                segtre.push_back({0, {0, 0}});
            }
            if (segtre[index].second.second == 0) {
                segtre[index].second.second = segtre.size();
                segtre.push_back({0, {0, 0}});
            }
        }
    }

    void update(int l, int r, int index, int tar, int val) {
        if (l == r) {
            segtre[index].first += val;
            return;
        }
        int mid = (l + r) >> 1;

        fix(l, r, index);

        if (tar <= mid) update(l, mid, segtre[index].second.first, tar, val);
        else update(mid + 1, r, segtre[index].second.second, tar, val);
        segtre[index].first = segtre[segtre[index].second.first].first + segtre[segtre[index].second.second].first;
    }

    int getSum(int l, int r, int index, int u, int v) {
        if (l > v || r < u) return 0;
        if (u <= l && r <= v) return segtre[index].first;

        int mid = (l + r) >> 1;

        int le = 0, ri = 0;
        if (segtre[index].second.first != 0) le = getSum(l, mid, segtre[index].second.first, u, v);
        if (segtre[index].second.second != 0) ri = getSum(mid + 1, r, segtre[index].second.second, u, v);

        return le + ri;
    }
};

vector<sparseSeg> ehe;
vector<int> siz[400009];
int n;

int cur = 0;

unsigned long long ans = 0;

void dfs(int a) {
    int x;
    cin >> x;

    int e = cur;

    if (x == 0) {
        int le = ++cur; ehe.resize(ehe.size() + 1);
        dfs(le);
        int ri = ++cur; ehe.resize(ehe.size() + 1);
        dfs(ri);
        if (siz[le].size() < siz[ri].size()) {
            swap(le, ri);
        }

        unsigned long long ansFake = 0;

        for (int x : siz[ri]) {
            ansFake += ehe[le].getSum(1, n, 0, 1, x);
        }

        ans += min(ansFake, (unsigned long long) siz[le].size() * siz[ri].size() - ansFake);

        for (int x : siz[ri]) {
            ehe[le].update(1, n, 0, x, 1);
            siz[le].push_back(x);
        }

        swap(siz[e], siz[le]); siz[ri].clear();
        swap(ehe[e], ehe[le]); ehe[ri].segtre.clear();
    } else {
        ehe[e].update(1, n, 0, x, 1);
        siz[e].push_back(x);   
    }
}

int main() {
    cin >> n;

    ehe.resize(1);

    dfs(0);

    cout << ans;

    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...