이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <map>
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;
}
};
map<int, 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;
dfs(le);
int ri = ++cur;
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.erase(ehe.find(e));
} else {
ehe[e].update(1, n, 0, x, 1);
siz[e].push_back(x);
}
}
int main() {
cin >> n;
dfs(0);
cout << ans;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |