#include <cstdio>
#include <queue>
#include <vector>
#include <set>
using namespace std;
vector<pair<int, pair<int, int>>> left_rotate(vector<pair<int, pair<int, int>>> tree, int v)
{
vector<pair<int, pair<int, int>>> calc;
if (tree[v].second.second == -1) return calc;
if (tree[tree[v].second.second].second.first != -1) return calc;
int w = tree[v].second.second;
if (tree[v].first != -1)
{
if (tree[tree[v].first].second.second == v)
{
tree[tree[v].first].second.second = w;
}
else
{
tree[tree[v].first].second.first = w;
}
}
tree[w].first = tree[v].first;
tree[v].first = w;
tree[w].second.first = v;
tree[v].second.second = -1;
return tree;
}
vector<pair<int, pair<int, int>>> right_rotate(vector<pair<int, pair<int, int>>> tree, int v)
{
vector<pair<int, pair<int, int>>> calc;
if (tree[v].second.first == -1) return calc;
if (tree[tree[v].second.first].second.second != -1) return calc;
int w = tree[v].second.first;
if (tree[v].first != -1)
{
if (tree[tree[v].first].second.second == v)
{
tree[tree[v].first].second.second = w;
}
else
{
tree[tree[v].first].second.first = w;
}
}
tree[w].first = tree[v].first;
tree[v].first = w;
tree[w].second.second = v;
tree[v].second.first = -1;
return tree;
}
set<vector<pair<int, pair<int, int>>>> vis;
int bfs(vector<pair<int, pair<int, int>>> u, vector<pair<int, pair<int, int>>> t, int n)
{
queue<pair<vector<pair<int, pair<int, int>>>, int>> q;
q.push({u, 0});
while (!q.empty())
{
vector<pair<int, pair<int, int>>> v = q.front().first;
int d = q.front().second;
q.pop();
if (v == t) return d;
for (int i = 1; i <= n; i++)
{
vector<pair<int, pair<int, int>>> v1 = left_rotate(v, i);
if (v1.size())
{
if (vis.find(v1) == vis.end())
{
vis.insert(v1);
q.push({v1, d + 1});
}
}
v1 = right_rotate(v, i);
if (v1.size())
{
if (vis.find(v1) == vis.end())
{
vis.insert(v1);
q.push({v1, d + 1});
}
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
vector<pair<int, pair<int, int>>> s, t;
for (int i = 0; i <= n; i++)
{
s.push_back({-1,{-1,-1}});
t.push_back({-1,{-1,-1}});
}
for (int i = 1; i <= n; i++)
{
int a;
scanf("%d", &a);
s[i].first = a;
if (a == -1) continue;
if (i < a)
{
s[a].second.first = i;
}
else
{
s[a].second.second = i;
}
}
for (int i = 1; i <= n; i++)
{
int a;
scanf("%d", &a);
t[i].first = a;
if (a == -1) continue;
if (i < a)
{
t[a].second.first = i;
}
else
{
t[a].second.second = i;
}
}
int ret = bfs(s, t, n);
printf("%d\n", ret);
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | #include <cstdio> #include <queue> #include <vector> #include <set> using namespace std; vector<pair<int, pair<int, int>>> left_rotate(vector<pair<int, pair<int, int>>> tree, int v) { vector<pair<int, pair<int, int>>> calc; if (tree[v].second.second == -1) return calc; if (tree[tree[v].second.second].second.first != -1) return calc; int w = tree[v].second.second; if (tree[v].first != -1) { if (tree[tree[v].first].second.second == v) { tree[tree[v].first].second.second = w; } else { tree[tree[v].first].second.first = w; } } tree[w].first = tree[v].first; tree[v].first = w; tree[w].second.first = v; tree[v].second.second = -1; return tree; } vector<pair<int, pair<int, int>>> right_rotate(vector<pair<int, pair<int, int>>> tree, int v) { vector<pair<int, pair<int, int>>> calc; if (tree[v].second.first == -1) return calc; if (tree[tree[v].second.first].second.second != -1) return calc; int w = tree[v].second.first; if (tree[v].first != -1) { if (tree[tree[v].first].second.second == v) { tree[tree[v].first].second.second = w; } else { tree[tree[v].first].second.first = w; } } tree[w].first = tree[v].first; tree[v].first = w; tree[w].second.second = v; tree[v].second.first = -1; return tree; } set<vector<pair<int, pair<int, int>>>> vis; int bfs(vector<pair<int, pair<int, int>>> u, vector<pair<int, pair<int, int>>> t, int n) { queue<pair<vector<pair<int, pair<int, int>>>, int>> q; q.push({u, 0}); while (!q.empty()) { vector<pair<int, pair<int, int>>> v = q.front().first; int d = q.front().second; q.pop(); if (v == t) return d; for (int i = 1; i <= n; i++) { vector<pair<int, pair<int, int>>> v1 = left_rotate(v, i); if (v1.size()) { if (vis.find(v1) == vis.end()) { vis.insert(v1); q.push({v1, d + 1}); } } v1 = right_rotate(v, i); if (v1.size()) { if (vis.find(v1) == vis.end()) { vis.insert(v1); q.push({v1, d + 1}); } } } } } int main() { int n; scanf("%d", &n); vector<pair<int, pair<int, int>>> s, t; for (int i = 0; i <= n; i++) { s.push_back({-1,{-1,-1}}); t.push_back({-1,{-1,-1}}); } for (int i = 1; i <= n; i++) { int a; scanf("%d", &a); s[i].first = a; if (a == -1) continue; if (i < a) { s[a].second.first = i; } else { s[a].second.second = i; } } for (int i = 1; i <= n; i++) { int a; scanf("%d", &a); t[i].first = a; if (a == -1) continue; if (i < a) { t[a].second.first = i; } else { t[a].second.second = i; } } int ret = bfs(s, t, n); printf("%d\n", ret); return 0; } |
English