#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define L long long
#define MP make_pair
#define REP(i, n) for(int i = 0; i < n; ++i)
#define REPR(i, n) for(int i = n - 1; i >= 0; --i)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define FORR(i, a, b) for(int i = b - 1; i >= a; --i)
#define EB emplace_back
#define ST first
#define ND second
#define S size
#define RS resize
template<class T> using P = pair<T, T>;
template<class T> using V = vector<T>;
vector<int> rep;
L comp = 0;
int find(int a) {
if (a != rep[a] && rep[a] != 0) {
rep[a] = find(rep[a]);
}
return rep[a];
}
void onion(int a, int b) {
int ra = find(a), rb = find(b);
if (ra != 0 && rb != 0 && ra != rb) {
rep[ra] = rb;
comp--;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, k;
cin >> n >> k;
V<int> a(n), b(n);
rep.RS(2 * n + 1);
V<int> x(2 * n + 1), y(2 * n + 1);
REP(i, n) {
cin >> a[i];
x[a[i]] = i;
y[a[i]] = 0;
}
REP(i, n) {
cin >> b[i];
x[b[i]] = i;
y[b[i]] = 1;
}
V<L> res(k + 1);
FOR(i, 1, 2 * n + 1) {
rep.clear();
rep.RS(2 * n + 1);
comp = 0;
FOR(j, i, 2 * n + 1) {
rep[j] = j;
comp++;
if (y[j] == 0) {
onion(j, a[(x[j] - 1 + n) % n]);
onion(j, a[(x[j] + 1 + n) % n]);
onion(j, b[x[j]]);
}
else {
onion(j, b[(x[j] - 1 + n) % n]);
onion(j, b[(x[j] + 1 + n) % n]);
onion(j, a[x[j]]);
}
if (comp <= k) {
res[comp]++;
}
}
}
FOR(i, 1, k + 1) {
cout << res[i] << ' ';
}
cout << '\n';
}
// g++ -std=c++17 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG plo.cpp -o a
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 | #include <bits/stdc++.h> using namespace std; #define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size #define RS resize template<class T> using P = pair<T, T>; template<class T> using V = vector<T>; vector<int> rep; L comp = 0; int find(int a) { if (a != rep[a] && rep[a] != 0) { rep[a] = find(rep[a]); } return rep[a]; } void onion(int a, int b) { int ra = find(a), rb = find(b); if (ra != 0 && rb != 0 && ra != rb) { rep[ra] = rb; comp--; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, k; cin >> n >> k; V<int> a(n), b(n); rep.RS(2 * n + 1); V<int> x(2 * n + 1), y(2 * n + 1); REP(i, n) { cin >> a[i]; x[a[i]] = i; y[a[i]] = 0; } REP(i, n) { cin >> b[i]; x[b[i]] = i; y[b[i]] = 1; } V<L> res(k + 1); FOR(i, 1, 2 * n + 1) { rep.clear(); rep.RS(2 * n + 1); comp = 0; FOR(j, i, 2 * n + 1) { rep[j] = j; comp++; if (y[j] == 0) { onion(j, a[(x[j] - 1 + n) % n]); onion(j, a[(x[j] + 1 + n) % n]); onion(j, b[x[j]]); } else { onion(j, b[(x[j] - 1 + n) % n]); onion(j, b[(x[j] + 1 + n) % n]); onion(j, a[x[j]]); } if (comp <= k) { res[comp]++; } } } FOR(i, 1, k + 1) { cout << res[i] << ' '; } cout << '\n'; } // g++ -std=c++17 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG plo.cpp -o a |
English