# include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll inf = 1e9 + 7;
ll n , k , q;
ll a[2][200005];
ll root[200005] , Rank[200005];
ll get_r(ll x) {
if (root[x] == x)return x;
else return get_r(root[x]);
}
void Union(ll x , ll y) {
ll r1 = get_r(x) , r2 = get_r(y);
if (r1 == r2)return;
if (Rank[r1] < Rank[r2])swap(r1 , r2);
root[r2] = r1;
Rank[r1] += Rank[r2];
}
bool used[2][200005];
pair<ll , ll> pos[200005];
vector<ll> check(ll i , ll j) {
vector<ll>arr;
if (i != 1 && used[i + 1][j])arr.push_back(a[i + 1][j]);
if (i != 0 && used[i - 1][j])arr.push_back(a[i - 1][j]);
if (j + 1 < n && used[i][j + 1])arr.push_back(a[i][j + 1]);
else if (j + 1 == n && used[i][0])arr.push_back(a[i][0]);
if (j - 1 >= 0 && used[i][j - 1])arr.push_back(a[i][j - 1]);
else if (j - 1 == -1 && used[i][n])arr.push_back(a[i][n]);
return arr;
}
void solve2() {
vector<ll>res(k + 5);
for (int i = 1; i <= 2 * n; i++) {
root[i] = i;
Rank[i] = 1;
used[pos[i].first][pos[i].second] = 0;
}
for (int l = 1; l <= 2 * n; l++) {
// cout << "l = " << l << endl;
ll kol = 0;
for (int r = l; r <= 2 * n; r++) {
vector<ll>new_pos = check(pos[r].first , pos[r].second);
/* cout << "new_pos = ";
for (auto val : new_pos)cout << val << ' ';
cout << endl; */
if (new_pos.size() == 0)kol++;
else {
for (int i = 0; i < new_pos.size(); i++)new_pos[i] = get_r(new_pos[i]);
sort(new_pos.begin() , new_pos.end());
ll prev = r , dif = 0;
for (int i = 0; i < new_pos.size(); i++) {
if (new_pos[i] != prev) {
Union(prev , new_pos[i]);
dif++;
}
prev = new_pos[i];
}
kol -= (dif - 1);
}
res[kol]++;
used[pos[r].first][pos[r].second] = 1;
// cout << "r = " << r << " kol = " << kol << " pos.sz = " << new_pos.size() << endl;
}
for (int r = l; r <= 2 * n; r++) {
root[r] = r;
Rank[r] = 1;
used[pos[r].first][pos[r].second] = 0;
}
}
for (int i = 1; i <= k; i++) {
cout << res[i] << ' ';
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> k;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
pos[a[i][j]] = {i , j};
}
}
/* if (k == 1)solve1();
else */ solve2();
}
/*
4
2827 1074 2431 1152
2900 1968 2994 1633
*/
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 | # include <bits/stdc++.h> typedef long long ll; using namespace std; const ll inf = 1e9 + 7; ll n , k , q; ll a[2][200005]; ll root[200005] , Rank[200005]; ll get_r(ll x) { if (root[x] == x)return x; else return get_r(root[x]); } void Union(ll x , ll y) { ll r1 = get_r(x) , r2 = get_r(y); if (r1 == r2)return; if (Rank[r1] < Rank[r2])swap(r1 , r2); root[r2] = r1; Rank[r1] += Rank[r2]; } bool used[2][200005]; pair<ll , ll> pos[200005]; vector<ll> check(ll i , ll j) { vector<ll>arr; if (i != 1 && used[i + 1][j])arr.push_back(a[i + 1][j]); if (i != 0 && used[i - 1][j])arr.push_back(a[i - 1][j]); if (j + 1 < n && used[i][j + 1])arr.push_back(a[i][j + 1]); else if (j + 1 == n && used[i][0])arr.push_back(a[i][0]); if (j - 1 >= 0 && used[i][j - 1])arr.push_back(a[i][j - 1]); else if (j - 1 == -1 && used[i][n])arr.push_back(a[i][n]); return arr; } void solve2() { vector<ll>res(k + 5); for (int i = 1; i <= 2 * n; i++) { root[i] = i; Rank[i] = 1; used[pos[i].first][pos[i].second] = 0; } for (int l = 1; l <= 2 * n; l++) { // cout << "l = " << l << endl; ll kol = 0; for (int r = l; r <= 2 * n; r++) { vector<ll>new_pos = check(pos[r].first , pos[r].second); /* cout << "new_pos = "; for (auto val : new_pos)cout << val << ' '; cout << endl; */ if (new_pos.size() == 0)kol++; else { for (int i = 0; i < new_pos.size(); i++)new_pos[i] = get_r(new_pos[i]); sort(new_pos.begin() , new_pos.end()); ll prev = r , dif = 0; for (int i = 0; i < new_pos.size(); i++) { if (new_pos[i] != prev) { Union(prev , new_pos[i]); dif++; } prev = new_pos[i]; } kol -= (dif - 1); } res[kol]++; used[pos[r].first][pos[r].second] = 1; // cout << "r = " << r << " kol = " << kol << " pos.sz = " << new_pos.size() << endl; } for (int r = l; r <= 2 * n; r++) { root[r] = r; Rank[r] = 1; used[pos[r].first][pos[r].second] = 0; } } for (int i = 1; i <= k; i++) { cout << res[i] << ' '; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k; for (int i = 0; i < 2; i++) { for (int j = 0; j < n; j++) { cin >> a[i][j]; pos[a[i][j]] = {i , j}; } } /* if (k == 1)solve1(); else */ solve2(); } /* 4 2827 1074 2431 1152 2900 1968 2994 1633 */ |
English