#include <bits/stdc++.h> #define pb push_back using namespace std; const int N = 1e5 + 5; int tab[N][2], ile[N*2], n, k; vector<int> kraw[N*2]; bitset<2*N> odw; void dfs(int x){ odw[x]=true; for(auto v : kraw[x]){ if(!odw[v]){ dfs(v); } } } void build(int l, int r){ for(int i=1;i<=n*2;i++){ kraw[i].clear(); odw[i]=false; } for(int i=1;i<=n;i++){ if(tab[i][0]<l||tab[i][0]>r) continue; if(tab[i][1]<l||tab[i][1]>r) continue; kraw[i].pb(i+n); kraw[i+n].pb(i); } for(int i=1;i<=n-1;i++){ if(tab[i][0]<l||tab[i][0]>r) continue; if(tab[i+1][0]<l||tab[i+1][0]>r) continue; kraw[i].pb(i+1); kraw[i+1].pb(i); } for(int i=1;i<=n-1;i++){ if(tab[i][1]<l||tab[i][1]>r) continue; if(tab[i+1][1]<l||tab[i+1][1]>r) continue; kraw[i+n].pb(i+n+1); kraw[i+n+1].pb(i+n); } if(tab[1][0]>=l&&tab[1][0]<=r&&tab[n][0]>=l&&tab[n][0]<=r){ kraw[1].pb(n); kraw[n].pb(1); } if(tab[1][1]>=l&&tab[1][1]<=r&&tab[n][1]>=l&&tab[n][1]<=r){ kraw[1+n].pb(n+n); kraw[n+n].pb(1+n); } } int check(int l, int r){ int cnt=0; for(int i=1;i<=n;i++){ if(!odw[i]&&l<=tab[i][0]&&tab[i][0]<=r){ dfs(i); cnt++; } } for(int i=n+1;i<=n*2;i++){ if(!odw[i]&&l<=tab[i-n][1]&&tab[i-n][1]<=r){ dfs(i); cnt++; } } return cnt; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>tab[i][0]; } for(int i=1;i<=n;i++){ cin>>tab[i][1]; } for(int i=1;i<=n*2;i++){ for(int j=i;j<=n*2;j++){ build(i, j); ile[check(i, j)]++; } } for(int i=1;i<=k;i++){ cout<<ile[i]<<" "; } 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 | #include <bits/stdc++.h> #define pb push_back using namespace std; const int N = 1e5 + 5; int tab[N][2], ile[N*2], n, k; vector<int> kraw[N*2]; bitset<2*N> odw; void dfs(int x){ odw[x]=true; for(auto v : kraw[x]){ if(!odw[v]){ dfs(v); } } } void build(int l, int r){ for(int i=1;i<=n*2;i++){ kraw[i].clear(); odw[i]=false; } for(int i=1;i<=n;i++){ if(tab[i][0]<l||tab[i][0]>r) continue; if(tab[i][1]<l||tab[i][1]>r) continue; kraw[i].pb(i+n); kraw[i+n].pb(i); } for(int i=1;i<=n-1;i++){ if(tab[i][0]<l||tab[i][0]>r) continue; if(tab[i+1][0]<l||tab[i+1][0]>r) continue; kraw[i].pb(i+1); kraw[i+1].pb(i); } for(int i=1;i<=n-1;i++){ if(tab[i][1]<l||tab[i][1]>r) continue; if(tab[i+1][1]<l||tab[i+1][1]>r) continue; kraw[i+n].pb(i+n+1); kraw[i+n+1].pb(i+n); } if(tab[1][0]>=l&&tab[1][0]<=r&&tab[n][0]>=l&&tab[n][0]<=r){ kraw[1].pb(n); kraw[n].pb(1); } if(tab[1][1]>=l&&tab[1][1]<=r&&tab[n][1]>=l&&tab[n][1]<=r){ kraw[1+n].pb(n+n); kraw[n+n].pb(1+n); } } int check(int l, int r){ int cnt=0; for(int i=1;i<=n;i++){ if(!odw[i]&&l<=tab[i][0]&&tab[i][0]<=r){ dfs(i); cnt++; } } for(int i=n+1;i<=n*2;i++){ if(!odw[i]&&l<=tab[i-n][1]&&tab[i-n][1]<=r){ dfs(i); cnt++; } } return cnt; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>tab[i][0]; } for(int i=1;i<=n;i++){ cin>>tab[i][1]; } for(int i=1;i<=n*2;i++){ for(int j=i;j<=n*2;j++){ build(i, j); ile[check(i, j)]++; } } for(int i=1;i<=k;i++){ cout<<ile[i]<<" "; } return 0; } |