整体二分求助
查看原帖
整体二分求助
1050683
YoungL楼主2024/1/28 00:47

50分一半WA

#include <bits/stdc++.h>
#define int long long
#define lowbit(x) ((x)&-(x))

using namespace std;
int n, q, a[400005], c[400005], ans[400005], left_=INT_MAX, right_=INT_MIN;
struct quest{
    int id, x, y, k, op;
} questions[400005], lq[400005], rq[400005];

void update(int x, int val = 1) {
    for (int i=x; i<=n; i+=lowbit(i))
        c[i] += val;
}

int query(int x, int y) {
    if (x > y) swap(x, y);
    int ans = 0;
    for (int i=y; i>=1; i-=lowbit(i))
        ans += c[i];
    for (int i=x-1; i>=1; i-=lowbit(i))
        ans -= c[i];
    return ans;
}

void solve(int l, int r, int ql, int qr) {  // 值域
    if (ql > qr || l > r) return;
    if (l == r) {
        for (int i=ql; i<=qr; i++) {
            if (questions[i].op == 2)
                ans[questions[i].id] = l;
        }
        return;
    }
    int mid = (l + r) >> 1;
    int lt=0, rt=0;
    for (int i=ql; i<=qr; i++) {
        quest &q = questions[i];
        if (q.op == 1) {
            if (q.y <= mid)
                update(q.x, q.k),
                lq[++lt] = q;
            else rq[++rt] = q;
        }
        if (q.op == 2) {
            int cnt = query(q.x, q.y);
            if (cnt >= q.k) lq[++lt] = q;
            else q.k -= cnt,
                 rq[++rt] = q;
        }
    }
    for (int i=ql; i<=qr; i++) {
        if (questions[i].op == 1 && questions[i].y <= mid)
            update(questions[i].x, -questions[i].k);
    }
    for (int i=1; i<=lt; i++) questions[ql+i-1] = lq[i];
    for (int i=1; i<=rt; i++) questions[ql+lt+i-1] = rq[i];
    solve(l, mid, ql, ql+lt-1),
    solve(mid+1, r, ql+lt, qr);
}

signed main() {
    scanf("%lld%lld", &n, &q);
    for (int i=1; i<=n; i++) scanf("%lld", &a[i]);
    int x = 1;
    for (int i=1; i<=n; i++) {
        int id = a[i];
        a[i] = id;
        left_ = min(left_, id),
        right_ = max(right_, id);
        questions[x] = {x, i, a[i], 1, 1};
        x++;
    }
    for (int as=1; as<=q; as++) {
        int l, r, k;
        char c;
        while (scanf("%c", &c) && c != 'Q' && c != 'C');
        if (c == 'Q') {
            scanf("%lld%lld%lld", &l, &r, &k);
            questions[++x] = {x, l, r, k, 2};
        } else {
            scanf("%lld%lld", &l, &k);
            questions[++x] = {x, l, a[l], -1, 1};
            a[l] = k;
            questions[++x] = {x, l, a[l], 1, 1};
        }
    }
    solve(left_, right_, 1, x);
    for (int j=n+1; j<=x; j++) {
        if (ans[j])
            printf("%lld\n", ans[j]);
    }
    return 0;
}
2024/1/28 00:47
加载中...