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;
}

浙公网安备 33010602011771号