#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 |