#include <bits/stdc++.h> using namespace std; typedef long long LL; struct xxx{ int ojciec, ranga; }t[200009]; vector<int>v[200009]; void MakeSet(int x){ t[x].ojciec=x; t[x].ranga=0; } int Find(int x){ if(t[x].ojciec == x) return t[x].ojciec; t[x].ojciec=Find(t[x].ojciec); return t[x].ojciec; } void Union(int a, int b){ int fa=Find(a); int fb=Find(b); if(fa==fb)return; if(fa==1 || (fb!=1 && t[fa].ranga>t[fb].ranga) ){ t[fb].ojciec=t[fa].ojciec; t[fa].ranga++; } else{ t[fa].ojciec=t[fb].ojciec; t[fb].ranga++; } } int d1[100009]; int d2[100009]; LL res[15]; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, k; cin>>n>>k; for(int i=0; i<n; i++){ cin>>d1[i]; } for(int i=0; i<n; i++){ cin>>d2[i]; } for(int i=0; i<n; i++){ v[d1[i]].push_back(d2[i]); v[d2[i]].push_back(d1[i]); } for(int i=0; i<n; i++){ v[d1[i]].push_back(d1[(i+1)%n]); v[d1[(i+1)%n]].push_back(d1[i]); v[d2[i]].push_back(d2[(i+1)%n]); v[d2[(i+1)%n]].push_back(d2[i]); } for(int i=1; i<=2*n; i++){ for(int j=1; j<=2*n; j++){ MakeSet(j); } LL ile = 0; for(int j=i; j<=2*n; j++){ int a = Find(v[j][0]); int b = Find(v[j][1]); int c = Find(v[j][2]); int kk=0; int rozne = 0; if(a!=b)rozne++; if(a!=c)rozne++; if(b!=c)rozne++; if(a==b && b==c && a==c)rozne=1; if(a >= i && a <= j){ kk++; Union(a, j); } if(b >= i && b <= j){ kk++; Union(b, j); } if(c >= i && c <= j){ kk++; Union(c, j); } if(kk==0){ ile++; }else{ int rozne2=0; int aa = Find(v[j][0]); int bb = Find(v[j][1]); int cc = Find(v[j][2]); if(aa!=bb)rozne2++; if(aa!=cc)rozne2++; if(cc!=bb)rozne2++; if(aa==bb && bb==cc && aa==cc)rozne2=1; ile -= rozne - rozne2; } if(ile < 15){ res[ile]++; } } } for(int i=1; i<=k; i++){ cout<<res[i]<<" "; } cout<<"\n"; return 0; }
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include <bits/stdc++.h> using namespace std; typedef long long LL; struct xxx{ int ojciec, ranga; }t[200009]; vector<int>v[200009]; void MakeSet(int x){ t[x].ojciec=x; t[x].ranga=0; } int Find(int x){ if(t[x].ojciec == x) return t[x].ojciec; t[x].ojciec=Find(t[x].ojciec); return t[x].ojciec; } void Union(int a, int b){ int fa=Find(a); int fb=Find(b); if(fa==fb)return; if(fa==1 || (fb!=1 && t[fa].ranga>t[fb].ranga) ){ t[fb].ojciec=t[fa].ojciec; t[fa].ranga++; } else{ t[fa].ojciec=t[fb].ojciec; t[fb].ranga++; } } int d1[100009]; int d2[100009]; LL res[15]; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, k; cin>>n>>k; for(int i=0; i<n; i++){ cin>>d1[i]; } for(int i=0; i<n; i++){ cin>>d2[i]; } for(int i=0; i<n; i++){ v[d1[i]].push_back(d2[i]); v[d2[i]].push_back(d1[i]); } for(int i=0; i<n; i++){ v[d1[i]].push_back(d1[(i+1)%n]); v[d1[(i+1)%n]].push_back(d1[i]); v[d2[i]].push_back(d2[(i+1)%n]); v[d2[(i+1)%n]].push_back(d2[i]); } for(int i=1; i<=2*n; i++){ for(int j=1; j<=2*n; j++){ MakeSet(j); } LL ile = 0; for(int j=i; j<=2*n; j++){ int a = Find(v[j][0]); int b = Find(v[j][1]); int c = Find(v[j][2]); int kk=0; int rozne = 0; if(a!=b)rozne++; if(a!=c)rozne++; if(b!=c)rozne++; if(a==b && b==c && a==c)rozne=1; if(a >= i && a <= j){ kk++; Union(a, j); } if(b >= i && b <= j){ kk++; Union(b, j); } if(c >= i && c <= j){ kk++; Union(c, j); } if(kk==0){ ile++; }else{ int rozne2=0; int aa = Find(v[j][0]); int bb = Find(v[j][1]); int cc = Find(v[j][2]); if(aa!=bb)rozne2++; if(aa!=cc)rozne2++; if(cc!=bb)rozne2++; if(aa==bb && bb==cc && aa==cc)rozne2=1; ile -= rozne - rozne2; } if(ile < 15){ res[ile]++; } } } for(int i=1; i<=k; i++){ cout<<res[i]<<" "; } cout<<"\n"; return 0; } |