#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; } |
English