#include <bits/stdc++.h> #define fi first #define sc second #define forn(i,p,k) for(int i=(p);i<=(k);++i) #define forr(i,k,p) for(int i=(k);i>=(p);--i) #define ALL(v) begin(v), end(v) #define RET(smth) return void(cout<<smth<<'\n'); #define SIZ(v) (int)v.size() using namespace std; using pii = pair<int,int>; using ll = long long; #ifdef DEBUG #include "debug.h" #else #define debug(...) ; #endif const int MM = 100'013; const int inf = 1e9; int n; int tab[2][MM]; struct node { array<int, 11> cnt; int level; } T[MM<<3]; void merge(int ind) { int l = min(11,T[ind].level); for(int i=0;i<l;i++) T[ind].cnt[i] = 0; for(int i=l;i<11;i++) T[ind].cnt[i] = T[ind<<1].cnt[i-l] + T[ind<<1|1].cnt[i-l]; } void update(int p, int k, int l, int r, int ind, int val) { if(p > r || k < l) return; if(l<=p&&k<=r) { if(p!=k) { T[ind].level+=val; merge(ind); } else { if(T[ind].level < 11) T[ind].cnt[T[ind].level] = 0; T[ind].level+=val; if(T[ind].level < 11) T[ind].cnt[T[ind].level] = 1; } return; } int mid = (p+k)/2; update(p,mid,l,r,ind<<1,val); update(mid+1,k,l,r,ind<<1|1,val); merge(ind); } void init(int p, int k, int ind) { T[ind].cnt[0] = k-p+1; if(p==k) return; int mid = (p+k)/2; init(p,mid,ind<<1); init(mid+1,k,ind<<1|1); } void clear(int p, int k, int ind, int x) { if(p==k) { T[ind].level = inf; for(int i=0;i<11;i++) T[ind].cnt[i]=0; return; } int mid = (p+k)/2; if(x<=mid) clear(p,mid,ind<<1,x); else clear(mid+1,k,ind<<1|1,x); merge(ind); } pii intrv[MM]; long long ans[11]; bool calc(int ind1, int ind2) { int tcon = min(max(tab[0][ind1],tab[0][ind2]), max(tab[1][ind1],tab[1][ind2])); int tbeg = min(tab[0][ind2],tab[1][ind2]); if(tbeg < tcon) { intrv[ind1] = {tbeg, min(tcon,2*n+1)}; return true; } else { intrv[ind1] = {-1,-1}; return false; } } void recalc_ans() { for(int i=0;i<11;i++) ans[i] += T[1].cnt[i]; } int main() { #ifndef DEBUG ios_base::sync_with_stdio(0); cin.tie(0); #endif int k; cin >> n >> k; vector<pii> pos(2*n+1); for(int i=0;i<n;i++) { cin >> tab[0][i]; pos[tab[0][i]] = {0,i}; } for(int i=0;i<n;i++) { cin >> tab[1][i]; pos[tab[1][i]] = {1,i}; } init(1,2*n,1); for(int i=0;i<n;i++) { if(calc(i, i+1 == n ? 0 : i+1)) { // debug(i, intrv[i]); update(1,2*n,intrv[i].fi,intrv[i].sc-1,1,1); } } recalc_ans(); // for(int i=0;i<=k;i++) cout << ans[i] << ' '; // cout << '\n'; for(int i=1;i<2*n;i++) { auto [x,ind] = pos[i]; tab[x][ind] = inf; if(intrv[ind].fi != -1) { update(1,2*n,intrv[ind].fi, intrv[ind].sc-1,1,-1); } int pop = (ind == 0 ? n-1 : ind-1); if(intrv[pop].fi != -1) { update(1,2*n,intrv[pop].fi, intrv[pop].sc-1,1,-1); } clear(1,2*n,1,i); if(calc(pop, ind)) { update(1,2*n,intrv[pop].fi, intrv[pop].sc-1,1,1); } if(calc(ind, ind + 1 == n ? 0 : ind+1)) { update(1,2*n,intrv[ind].fi, intrv[ind].sc-1,1,1); } recalc_ans(); // for(int j=0;j<=k;j++) cout << ans[j] << ' '; // cout << '\n'; } ans[1] += ans[0]; for(int i=1;i<=k;i++) cout << ans[i] << ' '; // cout << '\n'; 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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #include <bits/stdc++.h> #define fi first #define sc second #define forn(i,p,k) for(int i=(p);i<=(k);++i) #define forr(i,k,p) for(int i=(k);i>=(p);--i) #define ALL(v) begin(v), end(v) #define RET(smth) return void(cout<<smth<<'\n'); #define SIZ(v) (int)v.size() using namespace std; using pii = pair<int,int>; using ll = long long; #ifdef DEBUG #include "debug.h" #else #define debug(...) ; #endif const int MM = 100'013; const int inf = 1e9; int n; int tab[2][MM]; struct node { array<int, 11> cnt; int level; } T[MM<<3]; void merge(int ind) { int l = min(11,T[ind].level); for(int i=0;i<l;i++) T[ind].cnt[i] = 0; for(int i=l;i<11;i++) T[ind].cnt[i] = T[ind<<1].cnt[i-l] + T[ind<<1|1].cnt[i-l]; } void update(int p, int k, int l, int r, int ind, int val) { if(p > r || k < l) return; if(l<=p&&k<=r) { if(p!=k) { T[ind].level+=val; merge(ind); } else { if(T[ind].level < 11) T[ind].cnt[T[ind].level] = 0; T[ind].level+=val; if(T[ind].level < 11) T[ind].cnt[T[ind].level] = 1; } return; } int mid = (p+k)/2; update(p,mid,l,r,ind<<1,val); update(mid+1,k,l,r,ind<<1|1,val); merge(ind); } void init(int p, int k, int ind) { T[ind].cnt[0] = k-p+1; if(p==k) return; int mid = (p+k)/2; init(p,mid,ind<<1); init(mid+1,k,ind<<1|1); } void clear(int p, int k, int ind, int x) { if(p==k) { T[ind].level = inf; for(int i=0;i<11;i++) T[ind].cnt[i]=0; return; } int mid = (p+k)/2; if(x<=mid) clear(p,mid,ind<<1,x); else clear(mid+1,k,ind<<1|1,x); merge(ind); } pii intrv[MM]; long long ans[11]; bool calc(int ind1, int ind2) { int tcon = min(max(tab[0][ind1],tab[0][ind2]), max(tab[1][ind1],tab[1][ind2])); int tbeg = min(tab[0][ind2],tab[1][ind2]); if(tbeg < tcon) { intrv[ind1] = {tbeg, min(tcon,2*n+1)}; return true; } else { intrv[ind1] = {-1,-1}; return false; } } void recalc_ans() { for(int i=0;i<11;i++) ans[i] += T[1].cnt[i]; } int main() { #ifndef DEBUG ios_base::sync_with_stdio(0); cin.tie(0); #endif int k; cin >> n >> k; vector<pii> pos(2*n+1); for(int i=0;i<n;i++) { cin >> tab[0][i]; pos[tab[0][i]] = {0,i}; } for(int i=0;i<n;i++) { cin >> tab[1][i]; pos[tab[1][i]] = {1,i}; } init(1,2*n,1); for(int i=0;i<n;i++) { if(calc(i, i+1 == n ? 0 : i+1)) { // debug(i, intrv[i]); update(1,2*n,intrv[i].fi,intrv[i].sc-1,1,1); } } recalc_ans(); // for(int i=0;i<=k;i++) cout << ans[i] << ' '; // cout << '\n'; for(int i=1;i<2*n;i++) { auto [x,ind] = pos[i]; tab[x][ind] = inf; if(intrv[ind].fi != -1) { update(1,2*n,intrv[ind].fi, intrv[ind].sc-1,1,-1); } int pop = (ind == 0 ? n-1 : ind-1); if(intrv[pop].fi != -1) { update(1,2*n,intrv[pop].fi, intrv[pop].sc-1,1,-1); } clear(1,2*n,1,i); if(calc(pop, ind)) { update(1,2*n,intrv[pop].fi, intrv[pop].sc-1,1,1); } if(calc(ind, ind + 1 == n ? 0 : ind+1)) { update(1,2*n,intrv[ind].fi, intrv[ind].sc-1,1,1); } recalc_ans(); // for(int j=0;j<=k;j++) cout << ans[j] << ' '; // cout << '\n'; } ans[1] += ans[0]; for(int i=1;i<=k;i++) cout << ans[i] << ' '; // cout << '\n'; return 0; } |