#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=1e5+7;
vector<pair<int,int>>V[2*LIM];
ll T[LIM][2], mi[8*LIM], ile[8*LIM][11], ans[11], sum[8*LIM], N=1, n;
void jeden(int a, int b, int c, int d) {
int x=-1, y=2*n;
if(b<a) x=max(x, b);
else y=min(y, b);
if(c<a) x=max(x, c);
else y=min(y, c);
if(d<a) x=max(x, d);
else y=min(y, d);
V[y-1].pb({x+1, 1});
if(a+1<=y-1) V[y-1].pb({a+1, -1});
if(x+1<=a-1) V[a-1].pb({x+1, -1});
}
void dwa(int a, int c, int b, int d) {
if(a>c) swap(a, c);
if(a<b && b<c || a<d && d<c) return;
if(b>d) swap(b, d);
if(c<b) {
d=b;
b=-1;
} else if(d<a) {
b=d;
d=2*n;
}
V[d-1].pb({b+1, 1});
V[c-1].pb({b+1, -1});
V[d-1].pb({a+1, -1});
if(a+1<=c-1) V[c-1].pb({a+1, 1});
}
void lacz(int v) {
mi[v]=min(mi[2*v], mi[2*v+1]+sum[2*v]);
sum[v]=sum[2*v]+sum[2*v+1];
int r=abs(mi[2*v+1]+sum[2*v]-mi[2*v]);
if(mi[2*v]<=mi[2*v+1]+sum[2*v]) {
rep(i, 11) ile[v][i]=ile[2*v][i];
rep(i, 11) if(i+r<11) ile[v][i+r]+=ile[2*v+1][i];
} else {
rep(i, 11) ile[v][i]=ile[2*v+1][i];
rep(i, 11) if(i+r<11) ile[v][i+r]+=ile[2*v][i];
}
}
void upd(int v, ll x) {
v+=N;
sum[v]+=x;
mi[v]+=x;
v/=2;
while(v) {
lacz(v);
v/=2;
}
}
void cnt(int l, int r) {
l+=N; r+=N;
vector<int>A, B;
A.pb(l);
if(l<r) B.pb(r);
while(l/2!=r/2) {
if(l%2==0) A.pb(l+1);
if(r%2==1) B.pb(r-1);
l/=2; r/=2;
}
reverse(all(B));
for(auto i : B) A.pb(i);
ll aktsum=0;
for(auto i : A) {
rep(j, 11) if(mi[i]+aktsum+j<11) ans[mi[i]+aktsum+j]+=ile[i][j];
aktsum+=sum[i];
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int k;
cin >> n >> k;
while(N<2*n) N*=2;
rep(i, 2) rep(j, n) {
cin >> T[j][i]; --T[j][i];
}
rep(i, n) {
jeden(T[i][0], T[i][1], T[(i+1)%n][0], T[(i+1)%n][1]);
jeden(T[i][1], T[i][0], T[(i+1)%n][0], T[(i+1)%n][1]);
dwa(T[i][0], T[(i+1)%n][1], T[i][1], T[(i+1)%n][0]);
dwa(T[i][1], T[(i+1)%n][0], T[i][0], T[(i+1)%n][1]);
dwa(T[i][0], T[i][1], T[(i+1)%n][0], T[(i+1)%n][1]);
}
rep(i, 2*n) for(auto j : V[i]) sum[N+j.st]+=j.nd;
rep(i, N) {
mi[N+i]=sum[N+i];
ile[N+i][0]=1;
}
for(int i=N-1; i; --i) lacz(i);
rep(i, 2*n) {
cnt(0, i);
for(auto j : V[i]) upd(j.st, -j.nd);
}
ans[1]+=ans[0];
rep(i, k) cout << ans[i+1] << " ";
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 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 | #include<bits/stdc++.h> using namespace std; typedef long long ll; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=1e5+7; vector<pair<int,int>>V[2*LIM]; ll T[LIM][2], mi[8*LIM], ile[8*LIM][11], ans[11], sum[8*LIM], N=1, n; void jeden(int a, int b, int c, int d) { int x=-1, y=2*n; if(b<a) x=max(x, b); else y=min(y, b); if(c<a) x=max(x, c); else y=min(y, c); if(d<a) x=max(x, d); else y=min(y, d); V[y-1].pb({x+1, 1}); if(a+1<=y-1) V[y-1].pb({a+1, -1}); if(x+1<=a-1) V[a-1].pb({x+1, -1}); } void dwa(int a, int c, int b, int d) { if(a>c) swap(a, c); if(a<b && b<c || a<d && d<c) return; if(b>d) swap(b, d); if(c<b) { d=b; b=-1; } else if(d<a) { b=d; d=2*n; } V[d-1].pb({b+1, 1}); V[c-1].pb({b+1, -1}); V[d-1].pb({a+1, -1}); if(a+1<=c-1) V[c-1].pb({a+1, 1}); } void lacz(int v) { mi[v]=min(mi[2*v], mi[2*v+1]+sum[2*v]); sum[v]=sum[2*v]+sum[2*v+1]; int r=abs(mi[2*v+1]+sum[2*v]-mi[2*v]); if(mi[2*v]<=mi[2*v+1]+sum[2*v]) { rep(i, 11) ile[v][i]=ile[2*v][i]; rep(i, 11) if(i+r<11) ile[v][i+r]+=ile[2*v+1][i]; } else { rep(i, 11) ile[v][i]=ile[2*v+1][i]; rep(i, 11) if(i+r<11) ile[v][i+r]+=ile[2*v][i]; } } void upd(int v, ll x) { v+=N; sum[v]+=x; mi[v]+=x; v/=2; while(v) { lacz(v); v/=2; } } void cnt(int l, int r) { l+=N; r+=N; vector<int>A, B; A.pb(l); if(l<r) B.pb(r); while(l/2!=r/2) { if(l%2==0) A.pb(l+1); if(r%2==1) B.pb(r-1); l/=2; r/=2; } reverse(all(B)); for(auto i : B) A.pb(i); ll aktsum=0; for(auto i : A) { rep(j, 11) if(mi[i]+aktsum+j<11) ans[mi[i]+aktsum+j]+=ile[i][j]; aktsum+=sum[i]; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int k; cin >> n >> k; while(N<2*n) N*=2; rep(i, 2) rep(j, n) { cin >> T[j][i]; --T[j][i]; } rep(i, n) { jeden(T[i][0], T[i][1], T[(i+1)%n][0], T[(i+1)%n][1]); jeden(T[i][1], T[i][0], T[(i+1)%n][0], T[(i+1)%n][1]); dwa(T[i][0], T[(i+1)%n][1], T[i][1], T[(i+1)%n][0]); dwa(T[i][1], T[(i+1)%n][0], T[i][0], T[(i+1)%n][1]); dwa(T[i][0], T[i][1], T[(i+1)%n][0], T[(i+1)%n][1]); } rep(i, 2*n) for(auto j : V[i]) sum[N+j.st]+=j.nd; rep(i, N) { mi[N+i]=sum[N+i]; ile[N+i][0]=1; } for(int i=N-1; i; --i) lacz(i); rep(i, 2*n) { cnt(0, i); for(auto j : V[i]) upd(j.st, -j.nd); } ans[1]+=ans[0]; rep(i, k) cout << ans[i+1] << " "; cout << '\n'; } |
English