Range Update Global Query.

这是一道我同学出的题目这里
这道题有个经典结论:答案=期望 \(\times\) 方案数。
所以这道题就很简单了…………
在一个区间 \([l_i,r_i]\) 中,\(\forall x\in [l_i,r_i]\)\(a_x\)\(\frac{r_i-l_i}{r_i-l_i+1}\) 的概率不变,有 \(\frac{1}{r_i-l_i+1}\) 的概率变为 \(v_i\),所以我们发现:

\[E\rightarrow \frac{(r_i-l_i)E}{r_i-l_i+1}+\frac{v_i}{r_i-l_i+1} \]

然后这样就变成了简单的区间加区间乘问题,然后没了…………

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5,MOD=998244353;
int n,m,q,cnt=1,a[N];
int qsm(int x,int a){
	int res=1;
	for(;a;a>>=1,x=x*x%MOD)
		if(a&1) res=res*x%MOD;
	return res;
}
template<typename TT>
class SGT{
	int T[N<<2],tag[N<<2],tag2[N<<2];
	void pushup(int x){
		T[x]=(T[x<<1]+T[x<<1|1])%MOD;
	}
	void pushdown(int x,int l,int r){
		int mid=(l+r)>>1;
		if(tag2[x]!=1){
			tag2[x<<1]=tag2[x<<1]*tag2[x]%MOD;
			tag2[x<<1|1]=tag2[x<<1|1]*tag2[x]%MOD;
			tag[x<<1]=tag[x<<1]*tag2[x]%MOD;
			tag[x<<1|1]=tag[x<<1|1]*tag2[x]%MOD;
			T[x<<1]=T[x<<1]*tag2[x]%MOD;
			T[x<<1|1]=T[x<<1|1]*tag2[x]%MOD;
			tag2[x]=1;
		}
		if(tag[x]){
			tag[x<<1]=(tag[x<<1]+tag[x])%MOD;
			tag[x<<1|1]=(tag[x<<1|1]+tag[x])%MOD;
			T[x<<1]=(T[x<<1]+(mid-l+1)*tag[x])%MOD;
			T[x<<1|1]=(T[x<<1|1]+(r-mid)*tag[x])%MOD;
			tag[x]=0;
		}
	}
public:
	void build(int x,int l,int r){
		tag2[x]=1;
		if(l==r) {T[x]=a[l];return ;}
		int mid=(l+r)>>1;
		build(x<<1,l,mid),build(x<<1|1,mid+1,r);
		pushup(x); 
	}
	int query(int x,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr) return T[x];
		int mid=(l+r)>>1;
		pushdown(x,l,r);
		int cnt=0;
		if(ql<=mid) cnt=(cnt+query(x<<1,l,mid,ql,qr))%MOD;
		if(qr>mid) cnt=(cnt+query(x<<1|1,mid+1,r,ql,qr))%MOD;
		return cnt;
	}
	void upd1(int x,int l,int r,int ql,int qr,int k){//乘k
		if(ql<=l&&r<=qr){
			tag2[x]=tag2[x]*k%MOD;
			tag[x]=tag[x]*k%MOD;
			T[x]=T[x]*k%MOD;
			return ;
		}
		int mid=(l+r)>>1;
		pushdown(x,l,r);
		if(ql<=mid) upd1(x<<1,l,mid,ql,qr,k);
		if(qr>mid) upd1(x<<1|1,mid+1,r,ql,qr,k);
		pushup(x); 
	}
	void upd2(int x,int l,int r,int ql,int qr,int k){//加k
		if(ql<=l&&r<=qr){
			tag[x]=(tag[x]+k)%MOD;
			T[x]=(T[x]+k*(r-l+1)%MOD)%MOD;
			return ;
		}
		int mid=(l+r)>>1;
		pushdown(x,l,r);
		if(ql<=mid) upd2(x<<1,l,mid,ql,qr,k);
		if(qr>mid) upd2(x<<1|1,mid+1,r,ql,qr,k);
		pushup(x); 
	}
};
SGT<int> T;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	T.build(1,1,n);
	while(m--){
		int l,r,k;cin>>l>>r>>k;
		int x=qsm(r-l+1,MOD-2);
		T.upd1(1,1,n,l,r,x*(r-l)%MOD);
		T.upd2(1,1,n,l,r,x*k%MOD);
		cnt=cnt*(r-l+1)%MOD;
	}
	while(q--){
		int l,r;
		cin>>l>>r;
		cout<<T.query(1,1,n,l,r)*cnt%MOD<<"\n";
	}
	return 0;
} 
posted @ 2025-01-28 17:59  I_AK_CTSC  阅读(20)  评论(0)    收藏  举报