#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;
/*
// Be yeu tle roi cay qua
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);
}
values[c].clear();
}
}
return resp + min(res1, res2);
}
*/
ll n,a[maxn],sz[maxn];
pair<ll,ll> bit[maxn];
vector<ll> G[maxn];
vector<ll> sus;
void update(ll idx, pair<ll,ll> v){
while(idx <= n){
bit[idx].first += v.first;
bit[idx].second += v.second;
idx += idx & (-idx);
}
}
pair<ll,ll> getSum(ll idx){
// {sum, count}
pair<ll,ll> res = {0ll, 0ll};
while(idx > 0){
res.first += bit[idx].first;
res.second += bit[idx].second;
idx -= idx & (-idx);
}
return res;
}
void dfs_size(ll u, ll p){
sz[u] = 1;
for(ll c: G[u]){
if(c != p){
dfs_size(c, u);
sz[u] += sz[c];
}
}
}
void delete_(ll u, ll p){
if(a[u]){
update(a[u], {-1ll, -1ll});
return;
}
for(ll c: G[u]){
if(c != p){
delete_(c, u);
}
}
}
void add_(ll u, ll p){
if(a[u]){
update(a[u], {1ll , 1ll});
return;
}
// update(order[u], {c[u], 1ll});
for(ll c: G[u]){
if(c != p){
add_(c, u);
}
}
}
ll dfslow(ll u, ll p){
if(a[u]){
return getSum(a[u] - 1).first;
}
ll res = 0;
for(ll c: G[u]){
if(c != p){
res += dfslow(c, u);
}
}
return res;
}
ll dfshigh(ll u, ll p){
if(a[u]){
return getSum(n).first - getSum(a[u]).first;
}
ll res = 0;
for(ll c: G[u]){
if(c != p){
res += dfshigh(c, u);
}
}
return res;
}
ll dfs(ll u, ll p){
ll msz = -1, v0 = 0;
for(ll c: G[u]){
if(c != p){
if(sz[c] > msz){
msz = sz[c];
v0 = c;
}
}
}
if(msz == -1){
update(a[u], {1ll , 1ll});
return 0;
}
ll res = 0;
for(ll c: G[u]){
if(c != p && c != v0){
res += dfs(c, u);
delete_(c, u);
}
}
res += dfs(v0, u);
ll res1 = 0, res2 = 0;
for(ll c: G[u]){
if(c != p && c != v0){
res1 += dfslow(c, u);
res2 += dfshigh(c, u);
}
}
for(ll c: G[u]){
if(c != p && c != v0){
add_(c, u);
}
}
// cout << u << ' ' << res1 << ' ' << res2;el;
return res + 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();
n = timer - 1;
dfs_size(root, 0);
cout << dfs(root, 0);
return 0;
}
/*
Code by: Nguyen Viet Trung Nhan
Cau Giay Secondary School
*/
Compilation message
rot.cpp: In function 'int main()':
rot.cpp:201:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
201 | freopen(__file_name ".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rot.cpp:202:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
202 | freopen(__file_name ".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
9820 KB |
Output is correct |
2 |
Correct |
6 ms |
9872 KB |
Output is correct |
3 |
Correct |
5 ms |
9820 KB |
Output is correct |
4 |
Correct |
5 ms |
9820 KB |
Output is correct |
5 |
Correct |
7 ms |
9820 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
9820 KB |
Output is correct |
2 |
Correct |
5 ms |
9816 KB |
Output is correct |
3 |
Correct |
4 ms |
9820 KB |
Output is correct |
4 |
Correct |
5 ms |
9820 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
9820 KB |
Output is correct |
2 |
Correct |
4 ms |
9908 KB |
Output is correct |
3 |
Correct |
5 ms |
9972 KB |
Output is correct |
4 |
Correct |
5 ms |
9796 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
10588 KB |
Output is correct |
2 |
Correct |
7 ms |
10420 KB |
Output is correct |
3 |
Correct |
10 ms |
10588 KB |
Output is correct |
4 |
Correct |
6 ms |
10588 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
11928 KB |
Output is correct |
2 |
Correct |
14 ms |
11356 KB |
Output is correct |
3 |
Correct |
50 ms |
13528 KB |
Output is correct |
4 |
Correct |
13 ms |
11868 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
64 ms |
16244 KB |
Output is correct |
2 |
Correct |
40 ms |
17408 KB |
Output is correct |
3 |
Correct |
44 ms |
19028 KB |
Output is correct |
4 |
Correct |
49 ms |
19280 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
46 ms |
26192 KB |
Output is correct |
2 |
Correct |
62 ms |
23840 KB |
Output is correct |
3 |
Correct |
88 ms |
21824 KB |
Output is correct |
4 |
Correct |
59 ms |
21368 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
87 ms |
25012 KB |
Output is correct |
2 |
Correct |
81 ms |
26160 KB |
Output is correct |
3 |
Correct |
89 ms |
29628 KB |
Output is correct |
4 |
Correct |
82 ms |
29132 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
231 ms |
34648 KB |
Output is correct |
2 |
Correct |
170 ms |
33228 KB |
Output is correct |
3 |
Correct |
135 ms |
33104 KB |
Output is correct |
4 |
Correct |
166 ms |
32852 KB |
Output is correct |
5 |
Correct |
293 ms |
31060 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
156 ms |
34900 KB |
Output is correct |
2 |
Correct |
155 ms |
40784 KB |
Output is correct |
3 |
Correct |
201 ms |
38432 KB |
Output is correct |
4 |
Correct |
127 ms |
41604 KB |
Output is correct |
5 |
Correct |
371 ms |
34164 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
159 ms |
35836 KB |
Output is correct |
2 |
Correct |
156 ms |
36704 KB |
Output is correct |
3 |
Correct |
273 ms |
34792 KB |
Output is correct |
4 |
Correct |
182 ms |
35872 KB |
Output is correct |
5 |
Correct |
128 ms |
42532 KB |
Output is correct |
6 |
Correct |
340 ms |
34896 KB |
Output is correct |