#include<bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; typedef long long ll; typedef pair<ll,ll> pll; typedef pair<ll,int> pli; typedef pair<int,ll> pil; typedef pair<int,int> pii; const ll INFLL=1e18+7; const int INF=1e9+7; #define pb push_back const int MAXN=1e5+7; int arr[2][MAXN]; int rep[MAXN*2],cnt[MAXN*2]; int Find(int x){ if(rep[x]==x) return x; return rep[x]=Find(rep[x]); } void Union(int a,int b){ a=Find(a); b=Find(b); if(cnt[b]>cnt[a]) swap(a,b); cnt[a]+=cnt[b]; rep[b]=a; } pii pos[MAXN*2]; int res[11]; int main() { ios_base::sync_with_stdio(0); int n,k; cin>>n>>k; for(int i=0;i<2;++i) for(int j=0;j<n;++j) cin>>arr[i][j]; for(int i=0;i<2;++i) for(int j=0;j<n;++j) pos[arr[i][j]]={i,j}; for(int i=1;i<=n*2;++i){ int curr=0; for(int j=0;j<=n*2;++j){ rep[j]=j; cnt[j]=1; } for(int j=i;j<=n*2;++j){ ++curr; int x=pos[j].first,y=pos[j].second; int nxt=(y+1)%n; //if(nxt==n) nxt=0; int pre=(y-1+n)%n; //if(pre==-1); pre=n-1; int l=arr[x][pre],r=arr[x][nxt],d=arr[!x][y]; if(l>=i&&l<j){ if(Find(x*n+y)!=Find(x*n+pre)){ Union(x*n+y,x*n+pre); --curr; } } if(r>=i&&r<j){ if(Find(x*n+y)!=Find(x*n+nxt)){ Union(x*n+y,x*n+nxt); --curr; } } if(d>=i&&d<j){ if(Find(x*n+y)!=Find((!x)*n+y)){ Union(x*n+y,(!x)*n+y); --curr; } } if(curr<=k) ++res[curr]; } } for(int i=1;i<=k;++i) cout<<res[i]<<" "; cout<<"\n"; }
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<bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; typedef long long ll; typedef pair<ll,ll> pll; typedef pair<ll,int> pli; typedef pair<int,ll> pil; typedef pair<int,int> pii; const ll INFLL=1e18+7; const int INF=1e9+7; #define pb push_back const int MAXN=1e5+7; int arr[2][MAXN]; int rep[MAXN*2],cnt[MAXN*2]; int Find(int x){ if(rep[x]==x) return x; return rep[x]=Find(rep[x]); } void Union(int a,int b){ a=Find(a); b=Find(b); if(cnt[b]>cnt[a]) swap(a,b); cnt[a]+=cnt[b]; rep[b]=a; } pii pos[MAXN*2]; int res[11]; int main() { ios_base::sync_with_stdio(0); int n,k; cin>>n>>k; for(int i=0;i<2;++i) for(int j=0;j<n;++j) cin>>arr[i][j]; for(int i=0;i<2;++i) for(int j=0;j<n;++j) pos[arr[i][j]]={i,j}; for(int i=1;i<=n*2;++i){ int curr=0; for(int j=0;j<=n*2;++j){ rep[j]=j; cnt[j]=1; } for(int j=i;j<=n*2;++j){ ++curr; int x=pos[j].first,y=pos[j].second; int nxt=(y+1)%n; //if(nxt==n) nxt=0; int pre=(y-1+n)%n; //if(pre==-1); pre=n-1; int l=arr[x][pre],r=arr[x][nxt],d=arr[!x][y]; if(l>=i&&l<j){ if(Find(x*n+y)!=Find(x*n+pre)){ Union(x*n+y,x*n+pre); --curr; } } if(r>=i&&r<j){ if(Find(x*n+y)!=Find(x*n+nxt)){ Union(x*n+y,x*n+nxt); --curr; } } if(d>=i&&d<j){ if(Find(x*n+y)!=Find((!x)*n+y)){ Union(x*n+y,(!x)*n+y); --curr; } } if(curr<=k) ++res[curr]; } } for(int i=1;i<=k;++i) cout<<res[i]<<" "; cout<<"\n"; } |