/*
Zadanie: Płótno
Autor: Tomasz Kwiatkowski
*/
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 7;
const int INF = 1e9 + 7;
int arr[MAXN][2];
vector<int> G[2*MAXN];
struct FAU {
vector<int> R;
vector<int> rank;
int _find(int v) { return (R[v] != v ? R[v] = _find(R[v]) : R[v]); }
bool connect(int u, int v)
{
int a = _find(u);
int b = _find(v);
if (a == b) return false;
if (rank[a] < rank[b])
swap(a, b);
rank[a] += rank[b];
R[b] = a;
return true;
}
FAU(int n)
{
R.resize(n + 1);
for (int i = 1; i <= n; ++i) R[i] = i;
rank.resize(n + 1, 1);
}
};
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, k;
cin >> n >> k;
for (int r = 0; r < 2; ++r) {
for (int i = 0; i < n; ++i)
cin >> arr[i][r];
}
for (int r = 0; r < 2; ++r) {
for (int i = 0; i < n; ++i)
G[arr[i][r]] = {arr[(i + n - 1) % n][r], arr[(i + 1) % n][r], arr[i][(r + 1) % 2]};
}
vector<int> ans(k);
for (int l = 1; l <= 2*n; ++l) {
FAU F(2*n);
int c = 0;
for (int r = l; r <= 2*n; ++r) {
++c;
for (auto u : G[r]) {
if (l <= u && u <= r)
c -= F.connect(r, u);
}
if (0 < c && c <= k)
++ans[c - 1];
}
}
for (auto c : ans)
cout << c << ' ';
cout << '\n';
return 0;
}
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 | /* Zadanie: Płótno Autor: Tomasz Kwiatkowski */ #include <bits/stdc++.h> #define fi first #define se second #define pb push_back using namespace std; typedef long long ll; const int MAXN = 1e5 + 7; const int INF = 1e9 + 7; int arr[MAXN][2]; vector<int> G[2*MAXN]; struct FAU { vector<int> R; vector<int> rank; int _find(int v) { return (R[v] != v ? R[v] = _find(R[v]) : R[v]); } bool connect(int u, int v) { int a = _find(u); int b = _find(v); if (a == b) return false; if (rank[a] < rank[b]) swap(a, b); rank[a] += rank[b]; R[b] = a; return true; } FAU(int n) { R.resize(n + 1); for (int i = 1; i <= n; ++i) R[i] = i; rank.resize(n + 1, 1); } }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, k; cin >> n >> k; for (int r = 0; r < 2; ++r) { for (int i = 0; i < n; ++i) cin >> arr[i][r]; } for (int r = 0; r < 2; ++r) { for (int i = 0; i < n; ++i) G[arr[i][r]] = {arr[(i + n - 1) % n][r], arr[(i + 1) % n][r], arr[i][(r + 1) % 2]}; } vector<int> ans(k); for (int l = 1; l <= 2*n; ++l) { FAU F(2*n); int c = 0; for (int r = l; r <= 2*n; ++r) { ++c; for (auto u : G[r]) { if (l <= u && u <= r) c -= F.connect(r, u); } if (0 < c && c <= k) ++ans[c - 1]; } } for (auto c : ans) cout << c << ' '; cout << '\n'; return 0; } |
English