主席树求助
查看原帖
主席树求助
338147
01bit楼主2023/7/8 14:19
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while (c < '0' || '9' < c) {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while ('0' <= c && c <= '9') {
        x = (x << 1) + (x << 3) + c - '0';
        c = getchar();
    }
    return x * f;
}
const ll inf = 0x3f3f3f3f3f3f3f3f;
const ll N = 2e5 + 5, M = 2e5 + 5, W = 1e6 + 5;
ll n, m, s, len;
ll w[N], v[N], b[N];
ll x[M], y[M];
vector<ll> C, V, L, R;
ll cnt = 0, root[N];
void makenode() {
    C.push_back(0);
    V.push_back(0);
    L.push_back(0);
    R.push_back(0);
}
void pushup(ll p) {
    C[p] = C[L[p]] + C[R[p]];
    V[p] = V[L[p]] + V[R[p]];
}
ll build(ll l, ll r) {
    ll p = ++cnt;
    makenode();
    if (l == r) {
        C[p] = V[p] = 0;
        return p;
    }
    ll mid = (l + r) >> 1;
    int Left = build(l, mid), Right = build(mid + 1, r);
    L[p] = Left;
    R[p] = Right;
    pushup(p);
    return p;
}
ll update(ll pre, ll l, ll r, ll k, ll q) {
    ll p = ++cnt;
    makenode();
    if (l == k && k == r) {
        C[p] = C[pre] + 1;
        V[p] = V[pre] + q;
        return p;
    }
    ll mid = (l + r) >> 1;
    if (k <= mid) {
        int Left = update(L[pre], l, mid, k, q);
        L[p] = Left;
        R[p] = R[pre];
    } else {
        int Right = update(R[pre], mid + 1, r, k, q);
        L[p] = L[pre];
        R[p] = Right;
    }
    pushup(p);
    return p;
}
ll queryC(ll pre1, ll pre2, ll l, ll r, ll k) {
    if (k <= l)
        return C[pre1] - C[pre2];
    ll mid = (l + r) >> 1, sum = 0;
    sum += queryC(R[pre1], R[pre2], mid + 1, r, k);
    if (k <= mid)
        sum += queryC(L[pre1], L[pre2], l, mid, k);
    return sum;
}
ll queryV(ll pre1, ll pre2, ll l, ll r, ll k) {
    if (k <= l)
        return V[pre1] - V[pre2];
    ll mid = (l + r) >> 1, sum = 0;
    sum += queryV(R[pre1], R[pre2], mid + 1, r, k);
    if (k <= mid)
        sum += queryV(L[pre1], L[pre2], l, mid, k);
    return sum;
}
ll check(ll z) {
    ll sum = 0;
    for (ll i = 1; i <= m; i++) {
        sum += queryC(root[y[i]], root[x[i] - 1], 1, len, z) *
               queryV(root[y[i]], root[x[i] - 1], 1, len, z);
    }
    return sum;
}
int main() {
    freopen("qc.in", "r", stdin);
    freopen("qc.out", "w", stdout);
    n = read(), m = read(), s = read();
    for (ll i = 1; i <= n; i++) {
        b[i] = w[i] = read(), v[i] = read();
    }
    sort(b + 1, b + n + 1);
    len = unique(b + 1, b + n + 1) - (b + 1);
    makenode();
    root[0] = build(1, len);
    for (ll i = 1; i <= n; i++) {
        ll id = lower_bound(b + 1, b + len + 1, w[i]) - b;
        root[i] = update(root[i - 1], 1, len, id, v[i]);
    }
    for (ll i = 1; i <= m; i++) {
        x[i] = read(), y[i] = read();
    }
    ll l = 0, r = len, ans = inf;
    while (l <= r) {
        ll mid = (l + r) >> 1;
        ll tmp = check(mid);
        if (tmp < s) {
            r = mid - 1;
            if (s - tmp < ans)
                ans = s - tmp;
        } else {
            l = mid + 1;
            if (tmp - s < ans)
                ans = tmp - s;
        }
    }
    printf("%lld\n", ans);
    return 0;
}
2023/7/8 14:19
加载中...