# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1020420 | nathan4690 | 무제 (POI11_rot) | C++14 | 1069 ms | 65536 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define pll ll
#define ld long double
#define el cout << '\n'
#define f1(i,n) for(ll i=1;i<=n;i++)
#define __file_name ""
using namespace std;
using namespace __gnu_pbds;
#define ordered_set tree<pll, null_type, less<pll>, rb_tree_tag, tree_order_statistics_node_update>
using namespace std;
const ll maxn = 4e5+5, inf=1e18;
ll n,a[maxn];
vector<ll> G[maxn];
ordered_set values[maxn];
ll dfs(ll u, ll p){
if(a[u]){
// cout << u << ' ' << a[u];el;
values[u].insert(a[u]);
return 0;
}
ll resp = 0;
ll le = 0, ri = 0;
for(ll c: G[u]){
if(c != p){
resp += dfs(c, u);
if(le == 0) le = c;
else ri = c;
}
}
if(values[ri].size() < values[le].size()) swap(values[ri], values[le]);
// le < ri
ll res1 = 0, res2 = 0;
// res1: count inversion if le comes before ri
// res2: count inversions if le comes after ri
for(auto item: values[le]){
res1 += values[ri].order_of_key(item);
res2 += values[ri].size() - values[ri].order_of_key(item+1);
}
// cout << u << ' ' << res1 << ' ' << res2;el;
for(ll c: G[u]){
if(c != p){
if(values[c].size() > values[u].size()) values[u].swap(values[c]);
for(auto item: values[c]){
values[u].insert(item);
}
}
}
return resp + min(res1, res2);
}
ll timer = 0;
ll readInput(){
ll v; cin >> v;
ll myval = timer;
timer++;
if(v){
a[myval] = v;
}else{
ll c1 = readInput(), c2 = readInput();
G[c1].push_back(myval);
G[myval].push_back(c1);
G[c2].push_back(myval);
G[myval].push_back(c2);
}
return myval;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
if(fopen(__file_name ".inp", "r")){
freopen(__file_name ".inp","r",stdin);
freopen(__file_name ".out","w",stdout);
}
// code here
cin >> n;
timer = 1;
ll root = readInput();
cout << dfs(root, 0);
return 0;
}
/*
Code by: Nguyen Viet Trung Nhan
Cau Giay Secondary School
*/
Compilation message (stderr)
# | 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... |