没有离散化的主席树,hack 数据 WA 求调
查看原帖
没有离散化的主席树,hack 数据 WA 求调
555809
houmy楼主2025/7/30 23:20
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int m, n;
ll cnt[6400010];
ll sum[6400010];
int lson[6400010], rson[6400010], tot;
int root[200010];
struct task{
    int l, r;
    ll p;
};
inline bool operator<(const task& a, const task& b){
    return a.p < b.p;
}
task tasks[100010];

void build(int &x, int l, int r){
    if(!x) x = ++tot;
    if(l == r) return;
    int mid = (l + r) >> 1;
    build(lson[x], l, mid);
    build(rson[x], mid + 1, r);
}

void update(int &x, int base, int l, int r, int pos, int d1, ll d2){
    if(!x) x = ++tot;
    if(l == r){
        cnt[x] = cnt[base] + d1;
        sum[x] = sum[base] + d2;
        return;
    }
    int mid = (l + r) >> 1;
    if(pos <= mid){
        update(lson[x], lson[base], l, mid, pos, d1, d2);
        rson[x] = rson[base];
    }else{
        update(rson[x], rson[base], mid + 1, r, pos, d1, d2);
        lson[x] = lson[base];
    }
    cnt[x] = cnt[lson[x]] + cnt[rson[x]];
    sum[x] = sum[lson[x]] + sum[rson[x]];
}
int query_cnt(int &x, int l, int r, int l2, int r2){
    if(!x) x = ++tot;
    if(l2 <= l && r <= r2) return cnt[x];
    int mid = (l + r) >> 1;
    int ans = 0;
    if(l2 <= mid) ans += query_cnt(lson[x], l, mid, l2, r2);
    if(r2 > mid) ans += query_cnt(rson[x], mid + 1, r, l2, r2);
    return ans;
}
int query_sum(int &x, int l, int r, int l2, int r2){
    if(!x) x = ++tot;
    if(l2 <= l && r <= r2) return sum[x];
    int mid = (l + r) >> 1;
    ll ans = 0;
    if(l2 <= mid) ans += query_sum(lson[x], l, mid, l2, r2);
    if(r2 > mid) ans += query_sum(rson[x], mid + 1, r, l2, r2);
    return ans;
}
int main(){
    cin >> m >> n;
    for(int i = 1; i <= m; i ++){
        cin >> tasks[i].l >> tasks[i].r >> tasks[i].p;
    }
    sort(tasks + 1, tasks + m + 1);
    build(root[0], 1, n + 1);
    for(int i = 1; i <= m; i ++){
        update(root[(i << 1) - 1], root[(i << 1) - 2], 1, n + 1, tasks[i].l, 1, tasks[i].p);
        update(root[(i << 1)], root[(i << 1) - 1], 1, n + 1, tasks[i].r + 1, -1, -tasks[i].p);
    }
    ll pre = 1;
    for(int e = 1; e <= n; e ++){
        int x, a, b, c;
        cin >> x >> a >> b >> c;
        int k = 1 + (1ll * a * pre + b) % c;
        int l = 1, r = m + 1;
        while(r - l > 1){
            int mid = (l + r) >> 1;
            int cur = query_cnt(root[mid << 1], 1, n + 1, 1, x);
            // printf("%d %d %d %d\n", l, r, mid, cur);
            if(cur <= k) l = mid;
            else r = mid;
        }
        cout << (pre = query_sum(root[l << 1], 1, n + 1, 1, x)) << endl;
    }
}

总体来说就是按优先级排序,然后二分,不知道为什么在 hack 数据上 WA,其它数据都过了,https://www.luogu.com.cn/record/227898855

看了前人的警示后人,没有找到问题,请问问题出在哪里?

2025/7/30 23:20
加载中...