题解:CF2176E Remove at the lowest cost

· · 题解

CF2176E - Remove at the lowest cost

大致写一下思考过程:

时间复杂度 \mathcal O (n\log n)

int rt, sl, L[N << 1], R[N << 1]; ll val[N << 1], mx[N << 1], tag[N << 1], len[N << 1];
int n, a[N], id[N]; ll c[N];
inline void up(int p) { val[p] = val[L[p]] + val[R[p]], mx[p] = max(mx[L[p]], mx[R[p]]); }
inline void opt(int p, ll k) { val[p] = len[p] * k, mx[p] = k, tag[p] = k; }
inline void down(int p) { (tag[p] != -1) && (opt(L[p], tag[p]), opt(R[p], tag[p]), tag[p] = -1); }
void Bld(int& p, int l, int r) {
    p = ++sl, len[p] = r - l + 1, tag[p] = -1;
    if (l == r) return val[p] = mx[p] = 1e13, void();
    int mid = l+r >> 1;
    Bld(L[p], l, mid), Bld(R[p], mid + 1, r);
    up(p);
}
void upd(int p, int l, int r, int nl, int nr, ll k) {
    if (l == nl && nr == r) return opt(p, k);
    down(p);
    int mid = nl+nr >> 1;
    if (r <= mid) upd(L[p], l, r, nl, mid, k);
    else if (l > mid) upd(R[p], l, r, mid + 1, nr, k);
    else upd(L[p], l, mid, nl, mid, k), upd(R[p], mid + 1, r, mid + 1, nr, k);
    up(p);
}
inline void clear() {
    forn (i, 1, sl) L[i] = R[i] = 0, val[i] = mx[i] = len[i] = 0, tag[i] = -1;
    rt = sl = 0;
}
int stk[N], top, lp[N], rp[N];
inline void solve() {
    cin >> n;
    forn (i, 1, n) cin >> a[i];
    forn (i, 1, n) cin >> c[i], id[i] = i;
    sort (id + 1, id + n + 1, [&] (int x, int y) {
        return c[x] > c[y];
    });
    stk[0] = 0, top = 0;
    forn (i, 1, n) {
        while (top && a[stk[top]] <= a[i])
            top -- ;
        lp[i] = stk[top];
        stk[++top] = i;
    }
    stk[0] = n + 1, top = 0;
    form (i, n, 1) {
        while (top && a[stk[top]] <= a[i])
            top -- ;
        rp[i] = stk[top];
        stk[++top] = i;
    }
    Bld(rt, 1, n);
    forn (i, 1, n) upd(rt, lp[id[i]] + 1, rp[id[i]] - 1, 1, n, c[id[i]]);
    cout << val[rt] - mx[rt] << ' ';
    forn (i, 1, n) {
        int u;
        cin >> u;
        upd(rt, lp[u] + 1, rp[u] - 1, 1, n, 0);
        cout << val[rt] - mx[rt] << " \n"[i == n];
    }
 }