整体二分过不了hack求调
查看原帖
整体二分过不了hack求调
623219
StrSeeker楼主2023/12/5 17:47

rt,用的整体二分

#include <bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
#define int long long
const int MAXN = 2e5 + 10;
int c[MAXN], n, m, clk, ver[MAXN], mx;
void update(int i, int v) {
    for (; i <= mx; i += i & -i) {
        if (ver[i] != clk)
            ver[i] = clk, c[i] = 0;
        c[i] += v;
    }
}
int query(int i) {
    int ret = 0;
    for (; i; i -= i & -i) {
        if (ver[i] != clk)
            ver[i] = clk, c[i] = 0;
        ret += c[i];
    }
    return ret;
}
struct Q {
    int l, r, s, id;
} q[MAXN];
int now[MAXN], s[MAXN], ans[MAXN], a[MAXN];
void solve(int l, int r, int ql, int qr) {
    if(ql>qr) return;
    if(l>r) return;
    clk++;
    if (l == r) {
        for (int i = ql; i <= qr; i++) {
            ans[r] += q[i].s == 1ll;
        }
        return;
    }
    int mid = (l + r) / 2ll;
    int midq = ql - 1ll;
    for (int i = l; i <= mid; i++)
        update(a[i], 1ll);
    for (int i = ql; i <= qr; i++) {
        int cnt = query(q[i].r) - query(q[i].l - 1);
        if (cnt >= q[i].s) {
            midq++;
            swap(q[midq], q[i]);
        } 
		else q[i].s -= cnt;
    }
    solve(l, mid, ql, midq);
    solve(mid + 1ll, r, midq + 1ll, qr);
}
signed main() {
    scanf("%lld %lld", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%lld %lld %lld", &q[i].l, &q[i].r, &q[i].s);
        mx = max({mx, q[i].l, q[i].r, q[i].s});
        q[i].id = i;
    }
    for (int i = 1; i <= m; i++) {
        scanf("%lld", a + i);
        mx = max(a[i], mx);
    }
    solve(1ll, m, 1ll, n);
    for (int i = 1; i <= m; i++) {
        printf("%lld\n", ans[i]);
	}
    return 0;
}
2023/12/5 17:47
加载中...