#include <cstdio>
#include <cstring>
#include <cassert>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 100000;
const int MAXK = 10;
int plot[MAXN+5][2];
int wynik[MAXK+5];
bool odw[MAXN+5][2];
int rows[MAXN*2+10];
int cols[MAXN*2+10];
void inline dodaj(int row, int col, queue<int> &q, int l, int r) {
if (!odw[col][row] && plot[col][row] >= l && plot[col][row] <= r) {
q.push(row+col*2);
}
}
int policz_ciekawosc(int l, int r, int n, int k) {
memset(odw, 0, n*sizeof(bool)*2);
queue<int> q;
int wynik = 0, row, col;
for (int w = l; w <=r; ++w) {
int i = cols[w];
int j = rows[w];
if (!odw[i][j] && plot[i][j] >= l && plot[i][j] <= r) {
++wynik;
if (wynik > k) {
return wynik;
}
q.push(2*i + j);
while(!q.empty()) {
row = q.front() % 2;
col = q.front() / 2;
q.pop();
odw[col][row] = true;
if (row == 0) {
dodaj(1, col, q, l, r);
} else {
dodaj(0, col, q, l, r);
}
dodaj(row, (col+1)%n, q, l, r);
dodaj(row, (col+n-1)%n, q, l, r);
}
}
}
return wynik;
}
#define NDEBUG
int main() {
int n, k;
scanf("%d%d", &n, &k);
for (int j = 0; j < 2; ++j) {
for (int i = 0; i < n; ++i) {
scanf("%d", &plot[i][j]);
--plot[i][j];
rows[plot[i][j]] = j;
cols[plot[i][j]] = i;
}
}
int maxcolor = 2*n;
for (int i = 1; i <=k; ++i) {
wynik[i] = 0;
}
wynik[1] = maxcolor;
for(int l = 0; l < maxcolor; ++l) {
for(int r = l+1; r < maxcolor; ++r) {
int ciek = policz_ciekawosc(l, r, n, k);
if (ciek <= k) {
++wynik[ciek];
}
}
}
for (int i = 1; i<=k;++i) {
printf("%d ", wynik[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 | #include <cstdio> #include <cstring> #include <cassert> #include <algorithm> #include <queue> using namespace std; const int MAXN = 100000; const int MAXK = 10; int plot[MAXN+5][2]; int wynik[MAXK+5]; bool odw[MAXN+5][2]; int rows[MAXN*2+10]; int cols[MAXN*2+10]; void inline dodaj(int row, int col, queue<int> &q, int l, int r) { if (!odw[col][row] && plot[col][row] >= l && plot[col][row] <= r) { q.push(row+col*2); } } int policz_ciekawosc(int l, int r, int n, int k) { memset(odw, 0, n*sizeof(bool)*2); queue<int> q; int wynik = 0, row, col; for (int w = l; w <=r; ++w) { int i = cols[w]; int j = rows[w]; if (!odw[i][j] && plot[i][j] >= l && plot[i][j] <= r) { ++wynik; if (wynik > k) { return wynik; } q.push(2*i + j); while(!q.empty()) { row = q.front() % 2; col = q.front() / 2; q.pop(); odw[col][row] = true; if (row == 0) { dodaj(1, col, q, l, r); } else { dodaj(0, col, q, l, r); } dodaj(row, (col+1)%n, q, l, r); dodaj(row, (col+n-1)%n, q, l, r); } } } return wynik; } #define NDEBUG int main() { int n, k; scanf("%d%d", &n, &k); for (int j = 0; j < 2; ++j) { for (int i = 0; i < n; ++i) { scanf("%d", &plot[i][j]); --plot[i][j]; rows[plot[i][j]] = j; cols[plot[i][j]] = i; } } int maxcolor = 2*n; for (int i = 1; i <=k; ++i) { wynik[i] = 0; } wynik[1] = maxcolor; for(int l = 0; l < maxcolor; ++l) { for(int r = l+1; r < maxcolor; ++r) { int ciek = policz_ciekawosc(l, r, n, k); if (ciek <= k) { ++wynik[ciek]; } } } for (int i = 1; i<=k;++i) { printf("%d ", wynik[i]); } } |
English