1 条题解

  • 1
    @ 2026-8-2 15:46:40
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define lc(p) (p<<1)
    #define rc(p) ((p<<1)|1)
    #define MID ((l+r)>>1)
    #define N 500010
    #define mod 998244353
    struct node{
    	int l,r,a,b;
    	int taga,tagb;
    	int _taga,an;
    }tr[N<<2];
    int n,q;
    int aa[N],bb[N];
    //a2(a1x+b1)+b2=a1*a2*x+(b1*a2+b2)
    //fl(x):a1x+b1
    //fr(x):a2x+b2
    //a(a..(ax+b)..+b)+b=a^n*x+b*(1+a+a^2+a^3+..+a^(n-1))=a^n*x+b*(a^n-1)/(a-1)
    //S=1+a+a^2+..+a^(n-1) aS=a+a^2+a^3+..+a^n (a-1)S=a^n-1 S=(a^n-1)/(a-1)
    int qpow(int a,int b){
    	if(a==0)return 0;
    	if(a==1)return 1;
    	int res=1;
    	for(;b;b>>=1,a=a*a%mod)if(b&1)res=res*a%mod;
    	return res;
    }
    void pushup(int p){
    	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 pushdown(int p){
    	int &taga=tr[p].taga,&tagb=tr[p].tagb;
    	if(taga){
    		int _taga=tr[p]._taga;
    		
    		tr[lc(p)].taga=tr[rc(p)].taga=taga;
    		tr[lc(p)].tagb=tr[rc(p)].tagb=tagb;
    		tr[lc(p)]._taga=tr[rc(p)]._taga=_taga;
    		
    		int nn=tr[lc(p)].r-tr[lc(p)].l+1;
    		int an=qpow(taga,nn);
    		tr[lc(p)].a=an;
    		if(taga==1)tr[lc(p)].b=nn*tagb%mod;
    		else tr[lc(p)].b=(an-1)*_taga%mod*tagb%mod;
    		
    		nn=tr[rc(p)].r-tr[rc(p)].l+1;
    		an=qpow(taga,nn);
    		tr[rc(p)].a=an;
    		if(taga==1)tr[rc(p)].b=nn*tagb%mod;
    		else tr[rc(p)].b=(an-1)*_taga%mod*tagb%mod;
    		
    		taga=0;
    	}
    }
    void build(int p,int l,int r){
    	if(l==r){
    		tr[p]={l,r,aa[l],bb[l],0,-1,0,0};
    		return;
    	}
    	tr[p]={l,r,0,0,0,-1,0,0};
    	build(lc(p),l,MID);build(rc(p),MID+1,r);
    	pushup(p);
    }
    void change(int p,int l,int r,int a,int b,int _taga){
    	if(tr[p].r<l||r<tr[p].l)return;
    	if(l<=tr[p].l&&tr[p].r<=r){
    		tr[p].taga=a,tr[p].tagb=b;
    		tr[p]._taga=_taga;
    		int nn=tr[p].r-tr[p].l+1;
    		int an=qpow(a,nn);
    		tr[p].a=an;
    		if(a==1)tr[p].b=nn*b%mod;
    		else tr[p].b=(an-1)*_taga%mod*b%mod;
    		return;
    	}
    	pushdown(p);
    	change(lc(p),l,r,a,b,_taga);change(rc(p),l,r,a,b,_taga);
    	pushup(p);
    }
    int query(int p,int l,int r,int x){
    	if(l<=tr[p].l&&tr[p].r<=r)return (tr[p].a*x%mod+tr[p].b)%mod;
    	pushdown(p);
    	int mid=(tr[p].l+tr[p].r)>>1;
    	if(l<=mid)x=query(lc(p),l,r,x)%mod;
    	if(r>mid)x=query(rc(p),l,r,x)%mod;
    	return x;
    }
    signed main(){
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	cin>>n>>q;
    	for(int i=1;i<=n;i++)cin>>aa[i]>>bb[i];
    	build(1,1,n);
    	while(q--){
    		int op;cin>>op;
    		if(op==0){
    			int l,r,c,d;cin>>l>>r>>c>>d;l++;
    			change(1,l,r,c,d,qpow(c-1,mod-2));
    		}
    		else{
    			int l,r,x;cin>>l>>r>>x;l++;
    			cout<<query(1,l,r,x)<<'\n';
    		}
    	}
    	
    	return 0;
    }
    
    • 1

    区间赋值区间复合(Range Set Range Composite)

    信息

    ID
    8132
    时间
    5000ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    58
    已通过
    6
    上传者