#include<bits/stdc++.h> using namespace std; int miejsce[200009]; int tab[200009],g[200009],glebia[200009],wynik[200009]; int n,k,spojne; int Lewy(int x) { if(x==1){return n;} else if(x==n+1){return 2*n;} return x-1; } int Prawy(int x) { if(x==n){return 1;} else if(x==n*2){return n+1;} return x+1; } int Pionowy(int x) { if(x<=n){return x+n;} else{return x-n;} } int F(int v) { if(v==g[v]){return v;} g[v]=F(g[v]); return g[v]; } void polacz(int a, int b) { a=F(a); b=F(b); if(a==b){return;} spojne--; if(glebia[a]<glebia[b]){swap(a,b);} if(glebia[a]==glebia[b]){glebia[a]++;} g[b]=a; } int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>k; for(int i=1;i<=n*2;i++) { cin>>tab[i]; miejsce[tab[i]]=i; } if(1==1) { for(int i=1;i<=n*2;i++) { for(int j=1;j<=n*2;j++) { g[miejsce[j]]=miejsce[j]; glebia[miejsce[j]]=0; } spojne=0; for(int j=i;j<=n*2;j++) { spojne++; int u=miejsce[j]; int a=Lewy(u),b=Prawy(u),c=Pionowy(u); if(i<=tab[a]&&tab[a]<=j) { polacz(u,a); } if(i<=tab[b]&&tab[b]<=j) { polacz(u,b); } if(i<=tab[c]&&tab[c]<=j) { polacz(u,c); } wynik[spojne]++; } } for(int i=1;i<=k;i++) { cout<<wynik[i]<<" "; } } else///k=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 | #include<bits/stdc++.h> using namespace std; int miejsce[200009]; int tab[200009],g[200009],glebia[200009],wynik[200009]; int n,k,spojne; int Lewy(int x) { if(x==1){return n;} else if(x==n+1){return 2*n;} return x-1; } int Prawy(int x) { if(x==n){return 1;} else if(x==n*2){return n+1;} return x+1; } int Pionowy(int x) { if(x<=n){return x+n;} else{return x-n;} } int F(int v) { if(v==g[v]){return v;} g[v]=F(g[v]); return g[v]; } void polacz(int a, int b) { a=F(a); b=F(b); if(a==b){return;} spojne--; if(glebia[a]<glebia[b]){swap(a,b);} if(glebia[a]==glebia[b]){glebia[a]++;} g[b]=a; } int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>k; for(int i=1;i<=n*2;i++) { cin>>tab[i]; miejsce[tab[i]]=i; } if(1==1) { for(int i=1;i<=n*2;i++) { for(int j=1;j<=n*2;j++) { g[miejsce[j]]=miejsce[j]; glebia[miejsce[j]]=0; } spojne=0; for(int j=i;j<=n*2;j++) { spojne++; int u=miejsce[j]; int a=Lewy(u),b=Prawy(u),c=Pionowy(u); if(i<=tab[a]&&tab[a]<=j) { polacz(u,a); } if(i<=tab[b]&&tab[b]<=j) { polacz(u,b); } if(i<=tab[c]&&tab[c]<=j) { polacz(u,c); } wynik[spojne]++; } } for(int i=1;i<=k;i++) { cout<<wynik[i]<<" "; } } else///k=1 { } return 0; } |