#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, k;
cin >> n >> k;
vector<vector<int> > plotno;
plotno.resize(2);
for (int i = 0; i < n; i++) {
int x;
cin >> x;
plotno[0].push_back(x);
}
for (int i = 0; i < n; i++) {
int x;
cin >> x;
plotno[1].push_back(x);
}
vector<int> ilosci;
ilosci.resize(k + 1);
for (int i = 1; i <= 2 * n; i++) {
for (int j=i; j<=2*n; j++){
//kolor musi byc w przedziale <i,j>
vector<bool> odwiedzone;
odwiedzone.resize(2*n, false);
int obs=0;
for (int x = 0; x < 2*n; x++) {
if (odwiedzone[(x/n)*n+ x%n]) continue;
if (plotno[x/n][x%n] >= i && plotno[x/n][x%n] <= j) {
queue<pair<int,int> > kolejka;
kolejka.push(make_pair(x/n, x%n));
odwiedzone[(x / n) * n + x % n] = 1;
while (!kolejka.empty()) {
//cout << x << endl;
pair<int, int> tmp= kolejka.front();
//cout << i << " " << j <<" "<<x << " " << tmp.first << " " << tmp.second << endl;
kolejka.pop();
if (plotno[abs(tmp.first - 1)][tmp.second] >= i && plotno[abs(tmp.first - 1)][tmp.second] <= j && odwiedzone[abs(tmp.first-1)*n+ tmp.second] == 0) {
kolejka.push(make_pair(abs(tmp.first - 1), tmp.second));
odwiedzone[abs(tmp.first - 1) * n + tmp.second] = 1;
}
else odwiedzone[abs(tmp.first-1)*n+tmp.second] = 1;
if (plotno[tmp.first][(tmp.second+1)%n] >= i && plotno[tmp.first][(tmp.second+1)%n] <= j && odwiedzone[tmp.first*n + (tmp.second+1)%n] == 0) {
kolejka.push(make_pair(tmp.first, (tmp.second+1)%n));
odwiedzone[tmp.first * n + (tmp.second + 1) % n] = 1;
}
else odwiedzone[tmp.first * n + (tmp.second+1)%n] = 1;
if (plotno[tmp.first][(tmp.second - 1+n)%n] >= i && plotno[tmp.first][(tmp.second - 1+n)%n] <= j && odwiedzone[tmp.first * n + (tmp.second - 1+n)%n] == 0) {
kolejka.push(make_pair(tmp.first, (tmp.second - 1+n)%n));
odwiedzone[tmp.first * n + (tmp.second - 1 + n) % n] = 1;
}
else odwiedzone[tmp.first * n + (tmp.second - 1+n)%n] = 1;
//cout << "D";
}
obs++;
}
}
if (obs <= k) ilosci[obs]++;
}
}
for (int i = 1; i <= k; i++) {
printf("%i ", ilosci[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 | #include <iostream> #include <vector> #include <queue> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, k; cin >> n >> k; vector<vector<int> > plotno; plotno.resize(2); for (int i = 0; i < n; i++) { int x; cin >> x; plotno[0].push_back(x); } for (int i = 0; i < n; i++) { int x; cin >> x; plotno[1].push_back(x); } vector<int> ilosci; ilosci.resize(k + 1); for (int i = 1; i <= 2 * n; i++) { for (int j=i; j<=2*n; j++){ //kolor musi byc w przedziale <i,j> vector<bool> odwiedzone; odwiedzone.resize(2*n, false); int obs=0; for (int x = 0; x < 2*n; x++) { if (odwiedzone[(x/n)*n+ x%n]) continue; if (plotno[x/n][x%n] >= i && plotno[x/n][x%n] <= j) { queue<pair<int,int> > kolejka; kolejka.push(make_pair(x/n, x%n)); odwiedzone[(x / n) * n + x % n] = 1; while (!kolejka.empty()) { //cout << x << endl; pair<int, int> tmp= kolejka.front(); //cout << i << " " << j <<" "<<x << " " << tmp.first << " " << tmp.second << endl; kolejka.pop(); if (plotno[abs(tmp.first - 1)][tmp.second] >= i && plotno[abs(tmp.first - 1)][tmp.second] <= j && odwiedzone[abs(tmp.first-1)*n+ tmp.second] == 0) { kolejka.push(make_pair(abs(tmp.first - 1), tmp.second)); odwiedzone[abs(tmp.first - 1) * n + tmp.second] = 1; } else odwiedzone[abs(tmp.first-1)*n+tmp.second] = 1; if (plotno[tmp.first][(tmp.second+1)%n] >= i && plotno[tmp.first][(tmp.second+1)%n] <= j && odwiedzone[tmp.first*n + (tmp.second+1)%n] == 0) { kolejka.push(make_pair(tmp.first, (tmp.second+1)%n)); odwiedzone[tmp.first * n + (tmp.second + 1) % n] = 1; } else odwiedzone[tmp.first * n + (tmp.second+1)%n] = 1; if (plotno[tmp.first][(tmp.second - 1+n)%n] >= i && plotno[tmp.first][(tmp.second - 1+n)%n] <= j && odwiedzone[tmp.first * n + (tmp.second - 1+n)%n] == 0) { kolejka.push(make_pair(tmp.first, (tmp.second - 1+n)%n)); odwiedzone[tmp.first * n + (tmp.second - 1 + n) % n] = 1; } else odwiedzone[tmp.first * n + (tmp.second - 1+n)%n] = 1; //cout << "D"; } obs++; } } if (obs <= k) ilosci[obs]++; } } for (int i = 1; i <= k; i++) { printf("%i ", ilosci[i]); } } |
English