MnZn求助主席树板子题
查看原帖
MnZn求助主席树板子题
425007
Kappa6174楼主2021/6/15 17:05

RT

#include<bits/stdc++.h>
#define Maxn 5000600
#define N 200020
#define int long long
using namespace std;
int s[N];
int e[N];
int p[N];
int tmp[N];
int to[N];
int rt[Maxn];
vector<int> ts[N];
vector<int> te[N];
int tot=0;
struct HJT_Tree{
    int l;
    int r;
    int sum;
    int num;
}t[Maxn];
void change(int k,int &p,int l,int r,int P,int v,int S)
{
    //cout<<p<<' '<<l<<'%'<<r<<'\n';
    p=++tot;
    t[p]=t[k];
    t[p].num+=v;
    t[p].sum+=S;
    if(l==r)
    {
        return;
    }
    int mid=l+r>>1;
    if(P>mid)
    {
      /*  if(!t[p].l)t[p].l=t[k].l;t[p].r=++tot;t[t[p].r]=t[t[k].r];*/
        change(t[k].r,t[p].r,mid+1,r,P,v,S);
    }
    else 
    {
     /*   if(!t[p].r)t[p].r=t[k].r;t[p].l=++tot;t[t[p].l]=t[t[k].l];*/
        change(t[k].l,t[p].l,l,mid,P,v,S);
    }
//    cout<<p<<'%'<<t[p].l<<' '<<t[p].r<<'\n';
    //upd(p);
}
int query(int p,int l,int r,int k)
{
  //  cout<<p<<' '<<l<<'&'<<r<<'\n';
    if(l==r)
    {
    //    cout<<p<<' '<<t[p].sum<<' '<<t[p].num<<'\n';
        //if(t[p].num==0)return 0;
        return t[p].sum/t[p].num*k;
    }
    int mid=l+r>>1;
    int V=t[t[p].l].num;
//    cout<<k<<"&&&"<<V<<'\n';
    if(k<=V)return query(t[p].l,l,mid,k);
    else return t[t[p].l].sum+query(t[p].r,mid+1,r,k-V);
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        cin>>s[i]>>e[i]>>p[i];
        tmp[i]=p[i];
    }
  //  cout<<'*'<<'\n';
    sort(tmp+1,tmp+n+1);
    int T=unique(tmp+1,tmp+n+1)-tmp-1;
    for(int i=1;i<=n;++i)
    {
        int k=lower_bound(tmp+1,tmp+T+1,p[i])-tmp;to[k]=p[i];p[i]=k;
    }
   // cout<<T<<"&\n";
    for(int i=1;i<=n;++i)
    {
        ts[s[i]].push_back(p[i]);
        te[e[i]+1].push_back(p[i]);
    }
    bool f=0;
    for(int i=1;i<=m+1;++i)
    {
       // f=1;
        rt[i]=rt[i-1];
        for(int j=0;j<ts[i].size();++j)
        {
            f=0;
            int k=ts[i][j];
       //     cout<<i<<'!'<<k<<' '<<1<<' '<<to[k]<<'\n';
            change(rt[i],rt[i],1,T,k,1,to[k]);
        }
        for(int j=0;j<te[i].size();++j)
        {
            f=0;
            int k=te[i][j];
     //       cout<<i<<'!'<<k<<' '<<-1<<' '<<-to[k]<<'\n';
            change(rt[i],rt[i],1,T,k,-1,-to[k]);
        }
        //if(f)rt[i]=rt[i-1];
    }
    int lst=1;
    for(int i=1;i<=m;++i)
    {
        int _x,_a,_b,_c;
        cin>>_x>>_a>>_b>>_c;
        int K=1+(_a*lst+_b)%_c;
    //    cout<<_x<<'#'<<K<<'\n';
        lst=query(rt[_x],1,T,K);
        cout<<lst<<'\n';
    }
    return 0;
}
2021/6/15 17:05
加载中...