#include <bits/stdc++.h> #define ft first #define sc second #define pb push_back #define FOR(i,n) for(int i=0; i<n; i++) #define watch(x) cout << (#x) << " == " << (x) << endl #define int short typedef long long ll; typedef long double ld; using namespace std; const ll N = 1e5; int tab[2*N+5][2]; int rep[2*N+5]; int height[2*N+5]; pair<int,int> nr[2*N+5]; ll ciek[11]={0}; int pn; inline void comp_path(int &a, int &r){ while (rep[a] != a){ a = rep[a]; rep[a] = r; } } inline int get_rep(int &a){ int it=0; int b = a; while (rep[b] != b){ it++; b = rep[b]; } if (it >= pn) {comp_path(a,b);} return b; } inline void uni(int &a, int &b){ if (height[a] == height[b]){ rep[b]=a; height[a]++; } else if (height[b] > height[a]){ rep[a]=b; } else { rep[b]=a; } } inline bool check(int a, int b){ int rep_a = get_rep(a); int rep_b = get_rep(b); if (rep_a != rep_b){ uni(rep_a, rep_b); return 1; } return 0; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k, x, y, ile; cin>>n>>k; pn=sqrt(n); FOR(y,2){ for(int x=1; x<=n; x++){ cin>>tab[x][y]; nr[tab[x][y]]={x,y}; } } tab[0][0]=tab[n][0]; tab[n+1][0]=tab[1][0]; tab[0][1]=tab[n][1]; tab[n+1][1]=tab[1][1]; ciek[1]=(n<<1); for (int l=1; l<=(n<<1); l++){ memset(height, 0, ((n<<1)+1)*sizeof(int)); for(int i=l; i<=(n<<1); i++){ rep[i]=i; } ile=1; for (int r=l+1; r<=(n<<1); r++){ x = nr[r].ft; y = nr[r].sc; int rep_a = get_rep(tab[x][y]); ile++; int b = tab[x-1][y]; if (l <= b && b <= r){ ile -= check(rep_a, b); } b = tab[x+1][y]; if (l <= b && b <= r){ ile -= check(rep_a, b); } b = tab[x][1-y]; if (l <= b && b <= r){ ile -= check(rep_a, b); } if (ile <= k){ ciek[ile]++; } } } FOR(i,k){ cout<<ciek[i+1]<<" "; } 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 115 116 117 118 119 120 121 122 | #include <bits/stdc++.h> #define ft first #define sc second #define pb push_back #define FOR(i,n) for(int i=0; i<n; i++) #define watch(x) cout << (#x) << " == " << (x) << endl #define int short typedef long long ll; typedef long double ld; using namespace std; const ll N = 1e5; int tab[2*N+5][2]; int rep[2*N+5]; int height[2*N+5]; pair<int,int> nr[2*N+5]; ll ciek[11]={0}; int pn; inline void comp_path(int &a, int &r){ while (rep[a] != a){ a = rep[a]; rep[a] = r; } } inline int get_rep(int &a){ int it=0; int b = a; while (rep[b] != b){ it++; b = rep[b]; } if (it >= pn) {comp_path(a,b);} return b; } inline void uni(int &a, int &b){ if (height[a] == height[b]){ rep[b]=a; height[a]++; } else if (height[b] > height[a]){ rep[a]=b; } else { rep[b]=a; } } inline bool check(int a, int b){ int rep_a = get_rep(a); int rep_b = get_rep(b); if (rep_a != rep_b){ uni(rep_a, rep_b); return 1; } return 0; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k, x, y, ile; cin>>n>>k; pn=sqrt(n); FOR(y,2){ for(int x=1; x<=n; x++){ cin>>tab[x][y]; nr[tab[x][y]]={x,y}; } } tab[0][0]=tab[n][0]; tab[n+1][0]=tab[1][0]; tab[0][1]=tab[n][1]; tab[n+1][1]=tab[1][1]; ciek[1]=(n<<1); for (int l=1; l<=(n<<1); l++){ memset(height, 0, ((n<<1)+1)*sizeof(int)); for(int i=l; i<=(n<<1); i++){ rep[i]=i; } ile=1; for (int r=l+1; r<=(n<<1); r++){ x = nr[r].ft; y = nr[r].sc; int rep_a = get_rep(tab[x][y]); ile++; int b = tab[x-1][y]; if (l <= b && b <= r){ ile -= check(rep_a, b); } b = tab[x+1][y]; if (l <= b && b <= r){ ile -= check(rep_a, b); } b = tab[x][1-y]; if (l <= b && b <= r){ ile -= check(rep_a, b); } if (ile <= k){ ciek[ile]++; } } } FOR(i,k){ cout<<ciek[i+1]<<" "; } return 0; } |