#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define sz(x) (int)x.size()
#define cat(x) cerr << #x << " = " << x << endl
#define IOS cin.tie(0); ios_base::sync_with_stdio(0)
using ll = long long;
using namespace std;
const int N = 1 << 19;
int n, ans;
int p[N], l[N], r[N], a[N], b[N];
void leftrotation(int v, int u) {
ans++;
if (p[v] != -1) {
if (r[p[v]] == v)
r[p[v]] = u;
else
l[p[v]] = u;
}
p[u] = p[v];
p[v] = u;
l[u] = v;
r[v] = 0;
}
void rightrotation(int v, int u) {
ans++;
if (p[v] != -1) {
if (r[p[v]] == v)
r[p[v]] = u;
else
l[p[v]] = u;
}
p[u] = p[v];
p[v] = u;
r[u] = v;
l[v] = 0;
}
void rec(int v, int u) {
while (v != u) {
if (v < u) {
rec(r[v], v + 1);
leftrotation(v, r[v]);
v++;
}
else {
rec(l[v], v - 1);
rightrotation(v, l[v]);
v--;
}
}
}
void fix(int v, int u) {
if (!v) return;
rec(v, u);
fix(l[u], a[u]);
fix(r[u], b[u]);
}
int main() {
scanf("%d", &n);
int r0, r1;
for (int i = 1; i <= n; ++i) {
scanf("%d", p + i);
if (p[i] == -1)
r0 = i;
else if (i < p[i])
l[p[i]] = i;
else
r[p[i]] = i;
}
for (int i = 1; i <= n; ++i) {
int w;
scanf("%d", &w);
if (w == -1)
r1 = i;
else if (i < w)
a[w] = i;
else
b[w] = i;
}
fix(r0, r1);
printf("%d\n", ans);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include <bits/stdc++.h> #define pb push_back #define fi first #define se second #define sz(x) (int)x.size() #define cat(x) cerr << #x << " = " << x << endl #define IOS cin.tie(0); ios_base::sync_with_stdio(0) using ll = long long; using namespace std; const int N = 1 << 19; int n, ans; int p[N], l[N], r[N], a[N], b[N]; void leftrotation(int v, int u) { ans++; if (p[v] != -1) { if (r[p[v]] == v) r[p[v]] = u; else l[p[v]] = u; } p[u] = p[v]; p[v] = u; l[u] = v; r[v] = 0; } void rightrotation(int v, int u) { ans++; if (p[v] != -1) { if (r[p[v]] == v) r[p[v]] = u; else l[p[v]] = u; } p[u] = p[v]; p[v] = u; r[u] = v; l[v] = 0; } void rec(int v, int u) { while (v != u) { if (v < u) { rec(r[v], v + 1); leftrotation(v, r[v]); v++; } else { rec(l[v], v - 1); rightrotation(v, l[v]); v--; } } } void fix(int v, int u) { if (!v) return; rec(v, u); fix(l[u], a[u]); fix(r[u], b[u]); } int main() { scanf("%d", &n); int r0, r1; for (int i = 1; i <= n; ++i) { scanf("%d", p + i); if (p[i] == -1) r0 = i; else if (i < p[i]) l[p[i]] = i; else r[p[i]] = i; } for (int i = 1; i <= n; ++i) { int w; scanf("%d", &w); if (w == -1) r1 = i; else if (i < w) a[w] = i; else b[w] = i; } fix(r0, r1); printf("%d\n", ans); return 0; } |
English