1 条题解

  • 0
    @ 2025-12-9 18:39:38
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define lc(p) tr[p].lc
    #define rc(p) tr[p].rc
    #define MID ((tr[p].l+tr[p].r)>>1)
    #define N 15000010//Q*log2(N)=5e5*log2(1e9)≈1.5e7 
    #define mod 998244353
    struct node{
    	int l,r,a,b,lc,rc;
    }tr[N];int cnt,rt;
    int n,q;
    int a[N],b[N];
    int newd(int l,int r){
    	int p=++cnt;
    	tr[p]=(node){l,r,1,0,0,0};
    	return p;
    }
    //c(ax+b)+d=ac*x+(bc+d)
    void pushup(int p){
    	//注意22,23行不要打成 if(!lc(p)||!rc(p))return;
    	if(!lc(p))lc(p)=newd(tr[p].l,MID);
    	if(!rc(p))rc(p)=newd(MID+1,tr[p].r);
    	tr[p].a=tr[rc(p)].a*tr[lc(p)].a%mod;
    	tr[p].b=(tr[rc(p)].a*tr[lc(p)].b%mod+tr[rc(p)].b)%mod;
    }
    void change(int &p,int l,int r,int id,int a,int b){
    	if(!p)p=newd(l,r);
    	if(tr[p].l==tr[p].r){
    		tr[p].a=a,tr[p].b=b;
    		return;
    	}
    	if(id<=MID)change(lc(p),l,MID,id,a,b);
    	else change(rc(p),MID+1,r,id,a,b);
    	pushup(p);
    }
    int query(int p,int l,int r,int x){
    	if(!p||tr[p].r<l||tr[p].l>r)return x;
    	if(l<=tr[p].l&&tr[p].r<=r)return (tr[p].a*x%mod+tr[p].b)%mod;
    	return query(rc(p),l,r,query(lc(p),l,r,x));
    }
    signed main(){
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	cin>>n>>q;
    	cnt=0;rt=0;
    	while(q--){
    		int op;cin>>op;
    		if(op==0){
    			int p,x,y;cin>>p>>x>>y;p++;
    			change(rt,1,n,p,x,y);
    		}
    		else{
    			int l,r,x;cin>>l>>r>>x;l++;
    			cout<<query(rt,l,r,x)<<'\n';
    		}
    	}
    	
    	return 0;
    }
    
    • 1

    点赋值区间复合(大数组)(Point Set Range Composite (Large Array))

    信息

    ID
    8128
    时间
    1000ms
    内存
    1024MiB
    难度
    6
    标签
    递交数
    20
    已通过
    11
    上传者