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
| #include <bits/stdc++.h>
const int kMaxN = 2.5e5 + 5, kMaxT = kMaxN * 35;
int n, k; int a[kMaxN], b[kMaxN]; int sgt_tot, rt[kMaxN], ls[kMaxT], rs[kMaxT], cnt[kMaxT]; int64_t ans, suma[kMaxT], sumb[kMaxT], f[kMaxT], p[kMaxT]; bool op[kMaxN]; std::vector<std::pair<int, int>> seg;
int update(int x, int l, int r, int ql, int v) { int nz = ++sgt_tot; ls[nz] = ls[x], rs[nz] = rs[x], cnt[nz] = cnt[x] + v, sumb[nz] = sumb[x] + v * ql; if (l == r) return nz; int mid = (l + r) >> 1; if (ql <= mid) ls[nz] = update(ls[x], l, mid, ql, v); else rs[nz] = update(rs[x], mid + 1, r, ql, v); return nz; }
int64_t query(int x, int y, int l, int r, int k) { if (k <= 0 || cnt[y] - cnt[x] == 0) return 0; if (l == r) return l * k; int mid = (l + r) >> 1, crs = cnt[rs[y]] - cnt[rs[x]]; if (k <= crs) return query(rs[x], rs[y], mid + 1, r, k); else return sumb[rs[y]] - sumb[rs[x]] + query(ls[x], ls[y], l, mid, k - crs); }
int getkth(int x, int y, int l, int r, int k) { if (l == r) return l; int mid = (l + r) >> 1, crs = cnt[rs[y]] - cnt[rs[x]]; if (k <= crs) return getkth(rs[x], rs[y], mid + 1, r, k); else return getkth(ls[x], ls[y], l, mid, k - crs); }
int64_t calc(int l, int r) { if (r - l + 1 < k) return -1e18; return query(rt[l - 1], rt[r], 1, 1e9, k) - (suma[r] - suma[l - 1]); }
void prework() { for (int i = 1; i <= n; ++i) { rt[i] = update(rt[i - 1], 1, 1e9, b[i], 1); suma[i] = suma[i - 1] + a[i]; } }
void solve(int l, int r, int L, int R) { if (l > r) return; int mid = (l + r) >> 1; f[mid] = calc(L, mid), p[mid] = L; for (int i = L + 1; i <= R; ++i) { int64_t val = calc(i, mid); if (val >= f[mid]) { f[mid] = val, p[mid] = i; } } solve(l, mid - 1, L, p[mid]), solve(mid + 1, r, p[mid], R); }
void getseg() { for (int i = k, j = 1; i <= n; ++i) { if (f[i] != ans) continue; for (;; ++j) { if (calc(j, i) == ans) seg.emplace_back(j, i); if (j == p[i]) break; } } }
void work() { static std::vector<std::pair<int, int>> vec[kMaxN]; for (auto [l, r] : seg) { int kth = getkth(rt[l - 1], rt[r], 1, 1e9, k); vec[l].emplace_back(kth, 1), vec[r + 1].emplace_back(kth, -1); } std::multiset<int> st; for (int i = 1; i <= n; ++i) { for (auto [x, v] : vec[i]) { if (v == 1) st.emplace(x); else st.erase(st.lower_bound(x)); } if (st.size() && b[i] >= *st.begin()) op[i] = 1; } }
void dickdreamer() { std::cin >> n >> k; for (int i = 1; i <= n; ++i) std::cin >> a[i]; for (int i = 1; i <= n; ++i) std::cin >> b[i]; prework(); memset(f, 0xcf, sizeof(f)); solve(k, n, 1, n); ans = *std::max_element(f + 1, f + 1 + n); getseg(), work(); std::cout << ans << '\n'; for (int i = 1; i <= n; ++i) std::cout << op[i]; }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|