#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 && v != hev) sack(v, x, 0);
int answer = 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:113:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
113 | freopen(name".INP", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
rot.cpp:114:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
114 | freopen(name".OUT", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
6 ms |
35408 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
6 ms |
35576 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
8 ms |
35408 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
232 ms |
37968 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1050 ms |
38736 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
130 ms |
41040 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1072 ms |
49480 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1073 ms |
43652 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1059 ms |
48844 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1067 ms |
47004 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1044 ms |
49224 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |