主席树板子WA0求条,悬关
查看原帖
主席树板子WA0求条,悬关
530468
_determination_楼主2024/1/12 17:19

RT

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define debug puts("IAKIOI")
#define inf (int)1e18
using namespace std;
struct Segtment_Tree{
    int ls,rs,val,sum;
}t[8000010];//200M
int tot;
int root[100010];
int p[100010];
vector<int>beg[100010],ed[100010];
int b[100010],lsh[100010];
#define mid (lf+rt)/2
int build(int lf,int rt)
{
    int node=++tot;
    if(lf==rt)
    {
        return tot;
    }
    t[node].ls=build(lf,mid);
    t[node].rs=build(mid+1,rt);
    return node;
}
void pu(int x)
{
    t[x].val=t[t[x].ls].val+t[t[x].rs].val;
    t[x].sum=t[t[x].ls].sum+t[t[x].rs].sum;
}
int upd(int x,int lf,int rt,int p,int v)
{
    int node=++tot;
    if(lf==rt)
    {
        t[node].val=t[x].val+v;
        t[node].sum=t[x].sum+v*b[p];
        return node;
    }
    if(p<=mid)
    {
        t[node].ls=upd(t[x].ls,lf,mid,p,v);
        t[node].rs=t[x].rs;
    }else{
        t[node].ls=t[x].ls;
        t[node].rs=upd(t[x].rs,mid+1,rt,p,v);
    }
    pu(node);
    return node;
}
int calc(int x,int lf,int rt,int k)
{
    if(!k)
    {
        return 0;
    }
    if(lf==rt)
    {
        // return t[x].val;
        return k*b[lf] ;
    }
    if(k<=t[t[x].ls].val)
    {
        return calc(t[x].ls,lf,mid,k);
    }else{
        return calc(t[x].rs,mid+1,rt,k-t[t[x].ls].val)+t[t[x].ls].sum;
    }
}
signed main()
{
    int n,q;
    cin >> n >> q;
    for ( int i = 1 ; i <= n ; i++ )
    {
        int l,r;
        cin >> l >> r >> p[i];
        b[i]=p[i];
        beg[l].push_back(i);
        ed[r+1].push_back(i);
    }
    sort(b+1,b+1+n);
    int m=unique(b+1,b+1+n)-b-1;
    for ( int i = 1 ; i <= n ; i++ )
    {
        lsh[i]=lower_bound(b+1,b+1+m,p[i])-b;
    }
    root[0]=build(1,m);
    for ( int i = 1 ; i <= q ; i++ )
    {
        root[i]=root[i-1];
        for ( int j = 0 ; j < beg[i].size() ; j++ )
        {
            root[i]=upd(root[i],1,m,lsh[beg[i][j]],1);
        }
        for ( int j = 0 ; j < ed[i].size() ; i++ )
        {
            root[i]=upd(root[i],1,m,lsh[ed[i][j]],-1);
        }
    }
    int lstans=1;
    while(q--)
    {
        int x,a,b,c,k;
        cin >> x >> a >> b >> c ;
        k=(a*lstans+b)%c+1;
        // cout << a << " " << a*lstans << " " << a*lstans+b << " " << (a*lstans+b)%c << endl;
        // cout << k << endl;
        if(k>=t[root[x]].val)
        {
            cout << t[root[x]].sum << endl;
            continue;
        }
        lstans=calc(root[x],1,m,k);
        cout << lstans << endl;
    }
	return 0;
}

Link

2024/1/12 17:19
加载中...