#include <bits/stdc++.h> using namespace std; vector <int> ile; vector <int> rep; vector <bool> used; int Find(int a) { if (rep[a] != a) rep[a] = Find(rep[a]); return rep[a]; } void Onion(int x, int y) { x = Find(x); y = Find(y); if (ile[x] > ile[y]) { ile[x] += ile[y]; rep[y] = x; } else { ile[y] += ile[x]; rep[x] = y; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, k; cin >> n >> k; vector <int> v(2*n); // jaki kolorek na itym miejscu vector <int> mie(2*n); // gdzie jest ity kolorek for (int i = 0; i < 2*n; i++) { int a; cin >> a; a--; v[i] = a; mie[a] = i; } vector <int> res(n); for (int i = 0; i < 2*n; i++) { ile.clear(); ile.resize(2*n); rep.clear(); rep.resize(2*n); used.clear(); used.resize(2*n); // czy ite miejsce jest uzyte used[mie[i]] = 1; ile[i] = 1; rep[i] = i; int par = 1; res[par]++; for (int j = i+1; j < 2*n; j++) { set <int> s; used[mie[j]] = 1; rep[j] = j; ile[j] = 1; if (mie[j] == 0) { if (used[n-1]) s.insert(Find(v[n-1])); } else if (mie[j] == n) { if (used[2*n-1]) s.insert(Find(v[2*n-1])); } else { if (used[mie[j]-1]) s.insert(Find(v[mie[j]-1])); } if (mie[j] == n-1) { if (used[0]) s.insert(Find(v[0])); } else if (mie[j] == 2*n-1) { if (used[n]) s.insert(Find(v[n])); } else { if (used[mie[j]+1]) s.insert(Find(v[mie[j]+1])); } if (used[(mie[j]+n) % (2*n)]) s.insert(Find(v[(mie[j]+n) % (2*n)])); if (s.size() == 0) par++; if (s.size() == 2) par--; if (s.size() == 3) par -= 2; for (auto a : s) Onion(j, a); res[par]++; } } for (int i = 1; i <= k; i++) cout << res[i] << " "; }
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> using namespace std; vector <int> ile; vector <int> rep; vector <bool> used; int Find(int a) { if (rep[a] != a) rep[a] = Find(rep[a]); return rep[a]; } void Onion(int x, int y) { x = Find(x); y = Find(y); if (ile[x] > ile[y]) { ile[x] += ile[y]; rep[y] = x; } else { ile[y] += ile[x]; rep[x] = y; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, k; cin >> n >> k; vector <int> v(2*n); // jaki kolorek na itym miejscu vector <int> mie(2*n); // gdzie jest ity kolorek for (int i = 0; i < 2*n; i++) { int a; cin >> a; a--; v[i] = a; mie[a] = i; } vector <int> res(n); for (int i = 0; i < 2*n; i++) { ile.clear(); ile.resize(2*n); rep.clear(); rep.resize(2*n); used.clear(); used.resize(2*n); // czy ite miejsce jest uzyte used[mie[i]] = 1; ile[i] = 1; rep[i] = i; int par = 1; res[par]++; for (int j = i+1; j < 2*n; j++) { set <int> s; used[mie[j]] = 1; rep[j] = j; ile[j] = 1; if (mie[j] == 0) { if (used[n-1]) s.insert(Find(v[n-1])); } else if (mie[j] == n) { if (used[2*n-1]) s.insert(Find(v[2*n-1])); } else { if (used[mie[j]-1]) s.insert(Find(v[mie[j]-1])); } if (mie[j] == n-1) { if (used[0]) s.insert(Find(v[0])); } else if (mie[j] == 2*n-1) { if (used[n]) s.insert(Find(v[n])); } else { if (used[mie[j]+1]) s.insert(Find(v[mie[j]+1])); } if (used[(mie[j]+n) % (2*n)]) s.insert(Find(v[(mie[j]+n) % (2*n)])); if (s.size() == 0) par++; if (s.size() == 2) par--; if (s.size() == 3) par -= 2; for (auto a : s) Onion(j, a); res[par]++; } } for (int i = 1; i <= k; i++) cout << res[i] << " "; } |