ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Luogu 3168 (主席树区间修改)

2021-09-20 23:03:19  阅读:177  来源: 互联网

标签:rt cnt ch int Luogu mid 修改 3168 define


P3168 [CQOI2015]任务查询系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

平常都是单点修改,区间修改就是差分呗,然后前缀和,我们要知道主席树本身就是有前缀和的性质。

//code by SPzos
/*
4 3
1 2 6
2 3 3
1 3 2
3 3 4
3 1 3 2
1 1 3 4
2 2 4 3
*/
#include<bits/stdc++.h>
#define ll long long
#define double
#define fo(i,j,k) for(register int i=j;i<=k;++i)
#define fd(i,j,k) for(register int i=j;i>=k;--i)
#define ff(i,x) for(register int i=head[x];i;i=e[i].nxt)
#define fv(i,x) for(register int i=0;i<v[x].size();++i)
using namespace std;
const int N=100010;
inline int read(){
    int ret=0,f=0;
    char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-') f=1;ch=getchar();}
    while(ch>='0' && ch<='9') {ret=(ret<<1)+(ret<<3)+ch-(1<<4)-(1<<5);ch=getchar();} 
    return f?-ret:ret;
}
struct tree{
    int ls,rs;
    ll sum,cnt;
}t[N*105];
int n,m,cnt;
inline void build(int &x,int l,int r){
    x=++cnt;
    if(l==r) return ;
    int mid=l+r>>1;
    build(t[x].ls,l,mid); 
    build(t[x].rs,mid+1,r); 
}
int a[N],b[N],rt[N<<6];
inline void update(int &x,int pre,int l,int r,int pos,int v){
    x=++cnt;
    t[x]=t[pre];
    t[x].sum+=v*b[pos];
    t[x].cnt+=v;
    if(l==r) return ;
    int mid=l+r>>1;
    if(pos<=mid) update(t[x].ls,t[pre].ls,l,mid,pos,v);
    else update(t[x].rs,t[pre].rs,mid+1,r,pos,v);
}
vector<int> be[N],up[N];
inline ll query(int x,int l,int r,int k){
    if(l==r) return t[x].sum/(t[x].cnt)*k;
    int num=t[t[x].ls].cnt;
    int mid=l+r>>1;
    if(k<=num) return query(t[x].ls,l,mid,k);
    else return t[t[x].ls].sum+query(t[x].rs,mid+1,r,k-num);
}
int main(){
    n=read();m=read(); 
    fo(i,1,n){
        int x=read(),y=read();
        a[i]=b[i]=read();
        up[x].push_back(i);
        be[y+1].push_back(i);
    }
    sort(b+1,b+1+n);
    int tot=unique(b+1,b+1+n)-b-1;
    build(rt[0],1,tot);
    fo(i,1,m){
        rt[i]=rt[i-1];
        for(register int j=0;j<up[i].size();++j){
            int p=lower_bound(b+1,b+1+tot,a[up[i][j]])-b;
            update(rt[i],rt[i],1,tot,p,1);
        }
        for(register int j=0;j<be[i].size();++j){
            int p=lower_bound(b+1,b+1+tot,a[be[i][j]])-b;
            update(rt[i],rt[i],1,tot,p,-1);
        }
    }
    ll la=1;
    fo(i,1,m){
        int x=read(),a=read(),b=read(),c=read();
        int k=(a*la+b)%c+1;
        if(k>t[rt[x]].cnt) la=t[rt[x]].sum;
        else la=query(rt[x],1,tot,k);
        printf("%lld\n",la);
    }
    return 0;
} 

 

标签:rt,cnt,ch,int,Luogu,mid,修改,3168,define
来源: https://www.cnblogs.com/simpleton/p/15315625.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有