#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]); } } |