#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int n, cnt_node, timerDFS, sz[N], val[N];
int tin[N], tout[N], tour[N], bit[N];
vector<int> adj[N];
int dfs_Size(int x, int p){
sz[x] = 1;
tour[tin[x] = ++timerDFS] = x;
for(int v : adj[x])if(v != p) sz[x] += dfs_Size(v, x);
tout[x] = timerDFS;
return sz[x];
}
void update(int p, int val){
if(!p) return;
for(; p <= n; p += p&-p) bit[p] += val;
return;
}
int get(int p){
int res = 0;
if(!p || p < 0) return 0;
for(; p; p -= p&-p) res += bit[p];
return res;
}
int get_range(int l, int r){
return get(r) - get(l-1);
}
void sack_add(int x){
if(val[x]) update(val[x], 1);
}
void sack_rem(int x){
if(val[x]) update(val[x], -1);
}
int sack(int x, int p, bool keep){
int hev = 0;
for(int v : adj[x])if(v != p && sz[v] > sz[hev]) hev = v;
int answer = 0;
for(int v : adj[x])if(v != p && v != hev) answer = answer + sack(v, x, 0);
if(hev) answer = answer + sack(hev, x, 1);
sack_add(x);
int left = (val[x] ? get_range(val[x]+1, n) : 0);
int right = (val[x] ? get_range(1, val[x]-1) : 0);
for(int v : adj[x])if(v != p && v != hev){
for(int i = tin[v]; i <= tout[v]; i++){
int cur_node = tour[i];
left = left + (val[cur_node] ? get_range(val[cur_node]+1, n) : 0);
right = right + (val[cur_node] ? get_range(1, val[cur_node]-1) : 0);
}
for(int i = tin[v]; i <= tout[v]; i++){
sack_add(tour[i]);
}
}
if(!keep){
for(int i = tin[x]; i <= tout[x]; i++)
sack_rem(tour[i]);
}
return answer + min(left, right);
}
void input(int cur_node)
{
int x; cin >> x;
if(!x){
// Start 2 new subtree
for(int i = 0; i < 2; i++){
adj[cur_node].push_back(++cnt_node);
input(cnt_node);
}
}
else{
// Leaf info
val[cur_node] = x;
}
return;
}
void solve()
{
cin >> n;
cnt_node = 1;
input(cnt_node);
dfs_Size(1, -1);
cout << sack(1, -1, 0) <<"\n";
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
#define name "InvMOD"
if(fopen(name".INP", "r")){
freopen(name".INP", "r", stdin);
freopen(name".OUT", "w", stdout);
}
solve();
return 0;
}
Compilation message
rot.cpp: In function 'int32_t main()':
rot.cpp:116:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
116 | freopen(name".INP", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
rot.cpp:117:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
117 | freopen(name".OUT", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
35408 KB |
Output is correct |
2 |
Correct |
6 ms |
35508 KB |
Output is correct |
3 |
Correct |
6 ms |
35408 KB |
Output is correct |
4 |
Correct |
6 ms |
35408 KB |
Output is correct |
5 |
Correct |
6 ms |
35484 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
35576 KB |
Output is correct |
2 |
Correct |
6 ms |
35408 KB |
Output is correct |
3 |
Correct |
6 ms |
35408 KB |
Output is correct |
4 |
Correct |
5 ms |
35408 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
35408 KB |
Output is correct |
2 |
Correct |
6 ms |
35408 KB |
Output is correct |
3 |
Correct |
6 ms |
35408 KB |
Output is correct |
4 |
Correct |
6 ms |
35408 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
37968 KB |
Output is correct |
2 |
Correct |
8 ms |
37712 KB |
Output is correct |
3 |
Correct |
7 ms |
38024 KB |
Output is correct |
4 |
Correct |
8 ms |
37968 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
38992 KB |
Output is correct |
2 |
Correct |
13 ms |
37996 KB |
Output is correct |
3 |
Correct |
35 ms |
40796 KB |
Output is correct |
4 |
Correct |
12 ms |
38736 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
41 ms |
41060 KB |
Output is correct |
2 |
Correct |
30 ms |
43600 KB |
Output is correct |
3 |
Correct |
34 ms |
45392 KB |
Output is correct |
4 |
Correct |
34 ms |
45220 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
41 ms |
50680 KB |
Output is correct |
2 |
Correct |
44 ms |
47688 KB |
Output is correct |
3 |
Correct |
54 ms |
44744 KB |
Output is correct |
4 |
Correct |
43 ms |
43600 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
59 ms |
43592 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
156 ms |
49480 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
105 ms |
47324 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
122 ms |
49304 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |