#include <bits/stdc++.h> const int MAXN = 100005; using namespace std; using ll = long long; using Pos = pair<int, int>; int n, k; int t[2][MAXN]; Pos pos[2 * MAXN]; ll res[15]; bool in_range(int x, int l, int r) { return l <= x && x <= r; } int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; Pos rep[2][MAXN]; Pos Find(Pos pos) { if (rep[pos.first][pos.second] == pos) return pos; return rep[pos.first][pos.second] = Find(rep[pos.first][pos.second]); } int Union(Pos pos1, Pos pos2) { auto ra = Find(pos1); auto rb = Find(pos2); if (ra != rb) { rep[ra.first][ra.second] = rb; return 1; } return 0; } bool are_neighbors(int l, int r) { int dist_x = pos[l].first != pos[r].first; int dist_y = abs(pos[l].second - pos[r].second); dist_y = min(dist_y, n - dist_y); return (dist_x + dist_y) == 1; } ll solve_k1(int l, int r) { if (l == r) return 1; if (l + 1 == r) { return 2 + are_neighbors(l, r); } int m = (l + r) / 2; ll res = solve_k1(l, m - 1) + solve_k1(m + 1, r); } int32_t main() { ios_base::sync_with_stdio(0); cin >> n >> k; for (int row = 0; row < 2; row++) { for (int column = 0; column < n; column++) { cin >> t[row][column]; pos[t[row][column]] = Pos(row, column); } } int COLORS = 2 * n; // if (k == 1) { // cout << solve_k1(1, COLORS); // } for (int left_color = 1; left_color <= COLORS; left_color++) { for (int row = 0; row < 2; row++) { for (int column = 0; column < n; column++) { rep[row][column] = Pos(row, column); } } int components = 0; for (int right_color = left_color; right_color <= COLORS; right_color++) { components++; int row = pos[right_color].first, column = pos[right_color].second; for (int i = 0; i < 4; i++) { int nx = row + dx[i]; int ny = column + dy[i]; if (!in_range(nx, 0, 1)) continue; if (ny < 0) ny = n - 1; if (ny >= n) ny = 0; if (in_range(t[nx][ny], left_color, right_color)) components -= Union({nx, ny}, {row, column}); } if (components <= k) res[components]++; } } for (int i = 1; i <= k; i++) cout << res[i] << " "; cout << "\n"; }
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> const int MAXN = 100005; using namespace std; using ll = long long; using Pos = pair<int, int>; int n, k; int t[2][MAXN]; Pos pos[2 * MAXN]; ll res[15]; bool in_range(int x, int l, int r) { return l <= x && x <= r; } int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; Pos rep[2][MAXN]; Pos Find(Pos pos) { if (rep[pos.first][pos.second] == pos) return pos; return rep[pos.first][pos.second] = Find(rep[pos.first][pos.second]); } int Union(Pos pos1, Pos pos2) { auto ra = Find(pos1); auto rb = Find(pos2); if (ra != rb) { rep[ra.first][ra.second] = rb; return 1; } return 0; } bool are_neighbors(int l, int r) { int dist_x = pos[l].first != pos[r].first; int dist_y = abs(pos[l].second - pos[r].second); dist_y = min(dist_y, n - dist_y); return (dist_x + dist_y) == 1; } ll solve_k1(int l, int r) { if (l == r) return 1; if (l + 1 == r) { return 2 + are_neighbors(l, r); } int m = (l + r) / 2; ll res = solve_k1(l, m - 1) + solve_k1(m + 1, r); } int32_t main() { ios_base::sync_with_stdio(0); cin >> n >> k; for (int row = 0; row < 2; row++) { for (int column = 0; column < n; column++) { cin >> t[row][column]; pos[t[row][column]] = Pos(row, column); } } int COLORS = 2 * n; // if (k == 1) { // cout << solve_k1(1, COLORS); // } for (int left_color = 1; left_color <= COLORS; left_color++) { for (int row = 0; row < 2; row++) { for (int column = 0; column < n; column++) { rep[row][column] = Pos(row, column); } } int components = 0; for (int right_color = left_color; right_color <= COLORS; right_color++) { components++; int row = pos[right_color].first, column = pos[right_color].second; for (int i = 0; i < 4; i++) { int nx = row + dx[i]; int ny = column + dy[i]; if (!in_range(nx, 0, 1)) continue; if (ny < 0) ny = n - 1; if (ny >= n) ny = 0; if (in_range(t[nx][ny], left_color, right_color)) components -= Union({nx, ny}, {row, column}); } if (components <= k) res[components]++; } } for (int i = 1; i <= k; i++) cout << res[i] << " "; cout << "\n"; } |