1 条题解

  • 0
    @ 2026-8-4 8:46:08
    #include<bits/stdc++.h>
    #define lc(p) tr[p].ls
    #define rc(p) tr[p].rs
    using namespace std;
    typedef long long ll;
    const int mod=998244353;
    int n,q,id,rt;
    ll a[500010];
    mt19937 rd(999983);
    struct N{
    	int ls,rs,rd;
    	ll v;
    	int lav;
    	ll sz,c,la1,la2;
    }tr[2000010];
    int nd(int v){
    	tr[++id]={0,0,rd(),v,0,1,v,1,0};
    	return id;
    }
    void pushup(int p){
    	tr[p].c=tr[p].v;
    	tr[p].sz=1;
    	if(lc(p)){
    		tr[p].c=(tr[p].c+tr[lc(p)].c)%mod;
    		tr[p].sz+=tr[lc(p)].sz;
    	}
    	if(rc(p)){
    		tr[p].c=(tr[p].c+tr[rc(p)].c)%mod;
    		tr[p].sz+=tr[rc(p)].sz;
    	}
    }
    void pushdown(int p){
    	if(tr[p].lav){
    		swap(lc(p),rc(p));
    		tr[lc(p)].lav^=1;
    		tr[rc(p)].lav^=1;
    		tr[p].lav=0; 
    	}
    	if(tr[p].la1!=1){
    		if(lc(p)){
    			tr[lc(p)].v=tr[lc(p)].v*tr[p].la1%mod;
    			tr[lc(p)].c=tr[lc(p)].c*tr[p].la1%mod;
    			tr[lc(p)].la1=tr[lc(p)].la1*tr[p].la1%mod;
    			tr[lc(p)].la2=tr[lc(p)].la2*tr[p].la1%mod;
    		}
    		if(rc(p)){
    			tr[rc(p)].v=tr[rc(p)].v*tr[p].la1%mod;
    			tr[rc(p)].c=tr[rc(p)].c*tr[p].la1%mod;
    			tr[rc(p)].la1=tr[rc(p)].la1*tr[p].la1%mod;
    			tr[rc(p)].la2=tr[rc(p)].la2*tr[p].la1%mod;
    		}
    		tr[p].la1=1;
    	}
    	if(tr[p].la2){
    		if(lc(p)){
    			tr[lc(p)].v=(tr[lc(p)].v+tr[p].la2)%mod;
    			tr[lc(p)].c=(tr[lc(p)].c+tr[p].la2*tr[lc(p)].sz%mod)%mod;
    			tr[lc(p)].la2=(tr[lc(p)].la2+tr[p].la2)%mod;
    		}
    		if(rc(p)){
    			tr[rc(p)].v=(tr[rc(p)].v+tr[p].la2)%mod;
    			tr[rc(p)].c=(tr[rc(p)].c+tr[p].la2*tr[rc(p)].sz%mod)%mod;
    			tr[rc(p)].la2=(tr[rc(p)].la2+tr[p].la2)%mod;
    		}
    		tr[p].la2=0;
    	}
    }
    void split(int p,int k,int &x,int &y){
    	if(!p){
    		x=y=0;
    		return ;
    	}
    	pushdown(p);
    	if(tr[lc(p)].sz<k){
    		x=p;
    		split(rc(p),k-tr[lc(p)].sz-1,rc(p),y);
    	}
    	else{
    		y=p;
    		split(lc(p),k,x,lc(p));
    	}
    	pushup(p);
    }
    int merge(int x,int y){
    	if(!x||!y)return x|y;
    	if(tr[x].rd<tr[y].rd){
    		pushdown(x);
    		rc(x)=merge(rc(x),y);
    		pushup(x);
    		return x;
    	}
    	else{
    		pushdown(y);
    		lc(y)=merge(x,lc(y));
    		pushup(y);
    		return y;
    	}
    }
    void ins(int k,int v){
    	int x,y;
    	split(rt,k,x,y);
    	rt=merge(merge(x,nd(v)),y);
    }
    void del(int k){
    	int x,y,z;
    	split(rt,k,x,y);
    	split(x,k-1,x,z);
    	rt=merge(x,y);
    }
    void reverse(int l,int r){
    	int x,y,z;
    	split(rt,r,x,y);
    	split(x,l-1,x,z);
    	tr[z].lav^=1;
    	rt=merge(merge(x,z),y);
    }
    void change(int l,int r,ll b,ll c){
    	int x,y,z;
    	split(rt,r,x,y);
    	split(x,l-1,x,z);
    	tr[z].v=(tr[z].v*b%mod+c)%mod;
    	tr[z].c=(tr[z].c*b%mod+c*tr[z].sz%mod)%mod;
    	tr[z].la1=tr[z].la1*b%mod;
    	tr[z].la2=(tr[z].la2*b%mod+c)%mod;
    	rt=merge(merge(x,z),y);
    }
    ll find(int l,int r){
    	int x,y,z;
    	split(rt,r,x,y);
    	split(x,l-1,x,z);
    	ll ans=tr[z].c;
    	rt=merge(merge(x,z),y);
    	return ans;
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cin>>n>>q;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    		rt=merge(rt,nd(a[i]));
    	}
    	while(q--){
    		int op;
    		cin>>op;
    		if(op==0){
    			int k,v;
    			cin>>k>>v;
    			ins(k,v);
    		}
    		else if(op==1){
    			int k;
    			cin>>k;k++;
    			del(k);
    		}
    		else if(op==2){
    			int l,r;
    			cin>>l>>r;
    			l++;
    			reverse(l,r); 
    		}
    		else if(op==3){
    			int l,r;
    			ll b,c;
    			cin>>l>>r>>b>>c;
    			l++;
    			change(l,r,b,c);
    		}
    		else{
    			int l,r;
    			cin>>l>>r;
    			l++;
    			cout<<find(l,r)<<'\n';
    		}
    	}
    	return 0;
    }
    
    • 1

    动态序列区间仿射变换区间求和(Dynamic Sequence Range Affine Range Sum)

    信息

    ID
    8137
    时间
    5000ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    26
    已通过
    3
    上传者