#include <bits/stdc++.h> #define iamspeed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define st first #define nd second using namespace std; int n, k, grup, t[2][100005], rankk[200005], parent[200005], sasiedzi[2][100005][3], res[20]; pair<int, int> poz[200005]; int UFfind(int x){ if(parent[x] != x){ return parent[x] = UFfind(parent[x]); } return parent[x]; } void UFunion(int x, int y){ int parX = UFfind(x); int parY = UFfind(y); if(parX != parY) grup--; if(rankk[parX] < rankk[parY]) parent[parX] = parY; else parent[parY] = parent[parX]; if(rankk[parX] == rankk[parY]) rankk[parX]++; } int main(){ cin >> n >> k; for(int i = 0 ; i <= 1 ; i++){ for(int j = 1 ; j <= n ; j++){ cin >> t[i][j]; poz[t[i][j]] = {i, j}; } } for(int i = 0 ; i <= 1 ; i++){ for(int j = 1 ; j <= n ; j++){ sasiedzi[i][j][0] = t[1 - i][j]; if(j == 1) { sasiedzi[i][j][1] = t[i][n]; sasiedzi[i][j][2] = t[i][j + 1]; } else if(j == n) { sasiedzi[i][j][1] = t[i][j - 1]; sasiedzi[i][j][2] = t[i][1]; } else{ sasiedzi[i][j][1] = t[i][j - 1]; sasiedzi[i][j][2] = t[i][j + 1]; } } } for(int i = 1 ; i <= 2 * n ; i++){ grup = 0; for(int j = 1 ; j <= 2* n ; j++){ rankk[j] = 0; parent[j] = j; } for(int j = i ; j <= 2 * n ; j++){ grup++; for(int l = 0 ; l < 3 ; l++){ if(sasiedzi[poz[j].st][poz[j].nd][l] >= i && sasiedzi[poz[j].st][poz[j].nd][l] <= j){ UFunion(j, sasiedzi[poz[j].st][poz[j].nd][l]); } } if(grup <= k)res[grup]++; } } for(int i = 1 ; i <= k ; i++){ cout << res[i] << " "; } cout << endl; }
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 | #include <bits/stdc++.h> #define iamspeed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define st first #define nd second using namespace std; int n, k, grup, t[2][100005], rankk[200005], parent[200005], sasiedzi[2][100005][3], res[20]; pair<int, int> poz[200005]; int UFfind(int x){ if(parent[x] != x){ return parent[x] = UFfind(parent[x]); } return parent[x]; } void UFunion(int x, int y){ int parX = UFfind(x); int parY = UFfind(y); if(parX != parY) grup--; if(rankk[parX] < rankk[parY]) parent[parX] = parY; else parent[parY] = parent[parX]; if(rankk[parX] == rankk[parY]) rankk[parX]++; } int main(){ cin >> n >> k; for(int i = 0 ; i <= 1 ; i++){ for(int j = 1 ; j <= n ; j++){ cin >> t[i][j]; poz[t[i][j]] = {i, j}; } } for(int i = 0 ; i <= 1 ; i++){ for(int j = 1 ; j <= n ; j++){ sasiedzi[i][j][0] = t[1 - i][j]; if(j == 1) { sasiedzi[i][j][1] = t[i][n]; sasiedzi[i][j][2] = t[i][j + 1]; } else if(j == n) { sasiedzi[i][j][1] = t[i][j - 1]; sasiedzi[i][j][2] = t[i][1]; } else{ sasiedzi[i][j][1] = t[i][j - 1]; sasiedzi[i][j][2] = t[i][j + 1]; } } } for(int i = 1 ; i <= 2 * n ; i++){ grup = 0; for(int j = 1 ; j <= 2* n ; j++){ rankk[j] = 0; parent[j] = j; } for(int j = i ; j <= 2 * n ; j++){ grup++; for(int l = 0 ; l < 3 ; l++){ if(sasiedzi[poz[j].st][poz[j].nd][l] >= i && sasiedzi[poz[j].st][poz[j].nd][l] <= j){ UFunion(j, sasiedzi[poz[j].st][poz[j].nd][l]); } } if(grup <= k)res[grup]++; } } for(int i = 1 ; i <= k ; i++){ cout << res[i] << " "; } cout << endl; } |