#include <bits/stdc++.h> #define MAX_N 100007 using namespace std; int kol[MAX_N][2]; bool odw[MAX_N][2]; queue<pair<int, int>> q; void bfs(int l, int r, int n){ int w, b; while(!q.empty()){ w = q.front().first; b = q.front().second; if(w == 0){ if(!odw[n-1][b] && kol[n-1][b] >= l && kol[n-1][b] <= r){ odw[n-1][b] = 1; q.push({n-1, b}); } }else{ if(!odw[w-1][b] && kol[w-1][b] >= l && kol[w-1][b] <= r){ odw[w-1][b] = 1; q.push({w-1, b}); } } if(w == n-1){ if(!odw[0][b] && kol[0][b] >= l && kol[0][b] <= r){ odw[0][b] = 1; q.push({0, b}); } }else{ if(!odw[w+1][b] && kol[w+1][b] >= l && kol[w+1][b] <= r){ odw[w+1][b] = 1; q.push({w+1, b}); } } if(b){ if(!odw[w][0] && kol[w][0] >= l && kol[w][0] <= r){ odw[w][0] = 1; q.push({w, 0}); } }else{ if(!odw[w][1] && kol[w][1] >= l && kol[w][1] <= r){ odw[w][1] = 1; q.push({w, 1}); } } q.pop(); } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, k; cin >> n >> k; for(int i = 0; i < n; i++) cin >> kol[i][0]; for(int i = 0; i < n; i++) cin >> kol[i][1]; int wyniki[k+1]; for(int i = 1; i <= k; i++) wyniki[i] = 0; int teraz; wyniki[1] = 2*n; for(int i = 1; i < 2*n; i++){ for(int j = i+1; j <= 2*n; j++){ teraz = 0; for(int l = 0; l < n; l++){ if(kol[l][0] >= i && kol[l][0] <= j && !odw[l][0]){ teraz++; if(teraz > k) break; q.push({l, 0}); bfs(i, j, n); }else if(kol[l][1] >= i && kol[l][1] <= j && !odw[l][1]){ teraz++; if(teraz > k) break; q.push({l, 1}); bfs(i, j, n); } } if(teraz <= k) wyniki[teraz]++; for(int l = 0; l < n; l++){ odw[l][0] = 0; odw[l][1] = 0; } } } for(int i = 1; i <= k; i++) cout << wyniki[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 87 | #include <bits/stdc++.h> #define MAX_N 100007 using namespace std; int kol[MAX_N][2]; bool odw[MAX_N][2]; queue<pair<int, int>> q; void bfs(int l, int r, int n){ int w, b; while(!q.empty()){ w = q.front().first; b = q.front().second; if(w == 0){ if(!odw[n-1][b] && kol[n-1][b] >= l && kol[n-1][b] <= r){ odw[n-1][b] = 1; q.push({n-1, b}); } }else{ if(!odw[w-1][b] && kol[w-1][b] >= l && kol[w-1][b] <= r){ odw[w-1][b] = 1; q.push({w-1, b}); } } if(w == n-1){ if(!odw[0][b] && kol[0][b] >= l && kol[0][b] <= r){ odw[0][b] = 1; q.push({0, b}); } }else{ if(!odw[w+1][b] && kol[w+1][b] >= l && kol[w+1][b] <= r){ odw[w+1][b] = 1; q.push({w+1, b}); } } if(b){ if(!odw[w][0] && kol[w][0] >= l && kol[w][0] <= r){ odw[w][0] = 1; q.push({w, 0}); } }else{ if(!odw[w][1] && kol[w][1] >= l && kol[w][1] <= r){ odw[w][1] = 1; q.push({w, 1}); } } q.pop(); } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, k; cin >> n >> k; for(int i = 0; i < n; i++) cin >> kol[i][0]; for(int i = 0; i < n; i++) cin >> kol[i][1]; int wyniki[k+1]; for(int i = 1; i <= k; i++) wyniki[i] = 0; int teraz; wyniki[1] = 2*n; for(int i = 1; i < 2*n; i++){ for(int j = i+1; j <= 2*n; j++){ teraz = 0; for(int l = 0; l < n; l++){ if(kol[l][0] >= i && kol[l][0] <= j && !odw[l][0]){ teraz++; if(teraz > k) break; q.push({l, 0}); bfs(i, j, n); }else if(kol[l][1] >= i && kol[l][1] <= j && !odw[l][1]){ teraz++; if(teraz > k) break; q.push({l, 1}); bfs(i, j, n); } } if(teraz <= k) wyniki[teraz]++; for(int l = 0; l < n; l++){ odw[l][0] = 0; odw[l][1] = 0; } } } for(int i = 1; i <= k; i++) cout << wyniki[i] << " "; } |