#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAXN = 2e5 + 5; const int d = 10; namespace SegT { int n, mn[MAXN<<2], f[MAXN<<2][d+1], tag[MAXN<<2]; #define ls(u) ((u)<<1) #define rs(u) ((u)<<1|1) #define lson(u) ls(u),l,mid #define rson(u) rs(u),mid+1,r inline void push_up(int u) { int vl = ls(u), vr = rs(u); if(mn[vl] > mn[vr]) swap(vl, vr); mn[u] = mn[vl]; for(int i=0; i<=d; ++i) f[u][i] = f[vl][i]; for(int i=0,j=mn[vr]-mn[vl]; i<=d && j<=d; ++i, ++j) f[u][j] += f[vr][i]; } inline void upd(int u,int k) { tag[u] += k; mn[u] += k; } inline void push_down(int u) { if(tag[u]) { upd(ls(u), tag[u]); upd(rs(u), tag[u]); tag[u] = 0; } } void build(int u,int l,int r) { mn[u] = 0; f[u][0] = r-l+1; tag[u] = 0; if(l == r) return; int mid = (l+r)>>1; build(lson(u)); build(rson(u)); } void update(int u,int l,int r,int ql,int qr,int k) { if(ql<=l && r<=qr){ upd(u,k); return;} push_down(u); int mid = (l+r)>>1; if(ql<=mid) update(lson(u),ql,qr,k); if(mid<qr) update(rson(u),ql,qr,k); push_up(u); } } int a[MAXN][2]; int main(void) { #ifdef He_Ren freopen("b.in","r",stdin); freopen("b.out","w",stdout); #endif int n,dd; scanf("%d%d",&n,&dd); for(int j=0; j<=1; ++j) for(int i=1; i<=n; ++i) scanf("%d",&a[i][j]); vector< tuple<int,int,int> > seg; // {r, l, k} for(int i=1; i<=n; ++i) { for(int j=0; j<=1; ++j) { seg.emplace_back(a[i][j], a[i][j], 1); int x = a[i][j], y = a[i%n+1][j]; seg.emplace_back(max(x,y), min(x,y), -1); } int x = a[i][0], y = a[i][1]; seg.emplace_back(max(x,y), min(x,y), -1); x = min({a[i][0], a[i][1], a[i%n+1][0], a[i%n+1][1]}); y = max({a[i][0], a[i][1], a[i%n+1][0], a[i%n+1][1]}); seg.emplace_back(y, x, 1); } sort(seg.begin(), seg.end()); static ll ans[d+1]; SegT :: build(1,1,2*n); for(int i=1,j=0; i<=2*n; ++i) { while(j<(int)seg.size() && get<0>(seg[j]) <= i) { SegT :: update(1,1,2*n, 1, get<1>(seg[j]), get<2>(seg[j])); ++j; } int cur = SegT :: mn[1], *val = SegT :: f[1]; for(int x=0, y=cur; x<=d && y<=d; ++x, ++y) ans[y] += val[x]; ans[0] -= 2*n-i; } ans[1] += ans[0]; for(int i=1; i<=dd; ++i) printf("%lld ",ans[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 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 | #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAXN = 2e5 + 5; const int d = 10; namespace SegT { int n, mn[MAXN<<2], f[MAXN<<2][d+1], tag[MAXN<<2]; #define ls(u) ((u)<<1) #define rs(u) ((u)<<1|1) #define lson(u) ls(u),l,mid #define rson(u) rs(u),mid+1,r inline void push_up(int u) { int vl = ls(u), vr = rs(u); if(mn[vl] > mn[vr]) swap(vl, vr); mn[u] = mn[vl]; for(int i=0; i<=d; ++i) f[u][i] = f[vl][i]; for(int i=0,j=mn[vr]-mn[vl]; i<=d && j<=d; ++i, ++j) f[u][j] += f[vr][i]; } inline void upd(int u,int k) { tag[u] += k; mn[u] += k; } inline void push_down(int u) { if(tag[u]) { upd(ls(u), tag[u]); upd(rs(u), tag[u]); tag[u] = 0; } } void build(int u,int l,int r) { mn[u] = 0; f[u][0] = r-l+1; tag[u] = 0; if(l == r) return; int mid = (l+r)>>1; build(lson(u)); build(rson(u)); } void update(int u,int l,int r,int ql,int qr,int k) { if(ql<=l && r<=qr){ upd(u,k); return;} push_down(u); int mid = (l+r)>>1; if(ql<=mid) update(lson(u),ql,qr,k); if(mid<qr) update(rson(u),ql,qr,k); push_up(u); } } int a[MAXN][2]; int main(void) { #ifdef He_Ren freopen("b.in","r",stdin); freopen("b.out","w",stdout); #endif int n,dd; scanf("%d%d",&n,&dd); for(int j=0; j<=1; ++j) for(int i=1; i<=n; ++i) scanf("%d",&a[i][j]); vector< tuple<int,int,int> > seg; // {r, l, k} for(int i=1; i<=n; ++i) { for(int j=0; j<=1; ++j) { seg.emplace_back(a[i][j], a[i][j], 1); int x = a[i][j], y = a[i%n+1][j]; seg.emplace_back(max(x,y), min(x,y), -1); } int x = a[i][0], y = a[i][1]; seg.emplace_back(max(x,y), min(x,y), -1); x = min({a[i][0], a[i][1], a[i%n+1][0], a[i%n+1][1]}); y = max({a[i][0], a[i][1], a[i%n+1][0], a[i%n+1][1]}); seg.emplace_back(y, x, 1); } sort(seg.begin(), seg.end()); static ll ans[d+1]; SegT :: build(1,1,2*n); for(int i=1,j=0; i<=2*n; ++i) { while(j<(int)seg.size() && get<0>(seg[j]) <= i) { SegT :: update(1,1,2*n, 1, get<1>(seg[j]), get<2>(seg[j])); ++j; } int cur = SegT :: mn[1], *val = SegT :: f[1]; for(int x=0, y=cur; x<=d && y<=d; ++x, ++y) ans[y] += val[x]; ans[0] -= 2*n-i; } ans[1] += ans[0]; for(int i=1; i<=dd; ++i) printf("%lld ",ans[i]); return 0; } |