社区讨论

萌新初学主席树1ms,样例过但是全WA求条

P3168[CQOI2015] 任务查询系统参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mm1e7oc2
此快照首次捕获于
2026/02/25 10:06
2 周前
此快照最后确认于
2026/02/25 10:26
2 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt,tot,root[200005],mp[100005];
vector<int> v[100005];
struct node{int l,r,val,sum;}a[50000005];
void change(int op1,int op2,int l,int r,int p,int c){
    if (l == r){
        a[op1].val = a[op2].val + 1;
        a[op1].sum = a[op2].sum + l;
        return;
    }
    int mid = (l + r) / 2;
    if (!a[op2].l) a[op2].l = ++tot;
    if (!a[op2].r) a[op2].r = ++tot;
    if (l <= p && p <= mid){
        a[op1].r = a[op2].r;
        a[op1].l = ++tot;
        change(a[op1].l,a[op2].l,l,mid,p,c);
    }
    else{
        a[op1].l = a[op2].l;
        a[op1].r = ++tot;
        change(a[op1].r,a[op2].r,mid + 1,r,p,c);
    }
    a[op1].val = a[a[op1].l].val + a[a[op1].r].val;
    a[op1].sum = a[a[op1].l].sum + a[a[op1].r].sum;
}
int query(int op,int l,int r,int k){
    if (l == r) return a[op].sum;
    int mid = (l + r) / 2,ck = a[a[op].l].val;
    return k <= ck ? query(a[op].l,l,mid,k) : a[a[op].l].sum + query(a[op].r,mid + 1,r,k - ck);
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n;
    for (int i = 1,l,r,x; i <= m; i++){
        cin >> l >> r >> x;
        v[l].push_back(x);
        v[r + 1].push_back(-x);
    }
    root[cnt] = ++tot;
    for (int i = 0; i <= n; i++){
        for (int j = 0; j < v[i].size(); j++){
            root[++cnt] = ++tot;
            change(root[cnt],root[cnt - 1],1,1e7,v[i][j],(v[i][j] > 0 ? 1 : -1));
        }
        mp[i] = root[cnt];
    }
    for (int x,a,b,c,ans = 1; n--; ){
        cin >> x >> a >> b >> c;
        int k = 1 + (a * ans + b) % c;
        ans = query(mp[x],1,1e7,k);
        cout << ans << '\n';
    }
    return 0;
}
自己写的哦,不知道对不对,如果不对可以证伪吗QwQ?

回复

1 条回复,欢迎继续交流。

正在加载回复...