社区讨论
30pts求条
P5142区间方差参与者 4已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mjiiwz9e
- 此快照首次捕获于
- 2025/12/23 19:50 2 个月前
- 此快照最后确认于
- 2025/12/26 13:50 2 个月前
CPP
#include<bits/stdc++.h>
#define lc u<<1
#define rc u<<1|1
#define N 100010
#define mod 1000000007
#define pf(x) ((x)*(x)%mod)
using namespace std;
typedef long long ll;
ll s[N*4],s2[N*4],a[N];
ll qp(ll x,ll y = mod-2){
ll ans = 1;
while(y){
if(y&1)ans = ans*x%mod;
x = x*x%mod;
y>>=1;
}
return ans;
}
void pushup(int u){
s[u] = (s[lc]+s[rc])%mod;
s2[u] = (s2[lc]+s2[rc])%mod;
}
void build(int u,int l,int r){
s[u] = a[l],s2[u] = pf(a[l]);
if(l==r)return ;
int mid = (l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(u);
}
void change(int u,int l,int r,int x,int k){
if(l==r){
s[u] = k,s2[u] = pf(k);
return ;
}
int mid = (l+r)>>1;
if(x<=mid)change(lc,l,mid,x,k);
else change(rc,mid+1,r,x,k);
pushup(u);
}
ll query(int u,int l,int r,int x,int y,int op){
if(x>r||y<l)return 0;
if(x<=l&&r<=y){
if(op==1)return s[u];
else return s2[u];
}
int mid = (l+r)>>1;
return (query(lc,l,mid,x,y,op)+query(rc,mid+1,r,x,y,op))%mod;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i = 1;i<=n;i++)cin>>a[i];
build(1,1,n);
int op;
long long s1,s2,ans,v,x,y;
for(int i = 1;i<=m;i++){
cin>>op>>x>>y;
if(op==1)change(1,1,n,x,y);
else{
s1 = query(1,1,n,x,y,1);
s2 = query(1,1,n,x,y,2);
v = qp(y-x+1);
s1 = s1*v%mod;
ans = s2*v%mod-s1*s1%mod;
cout<<(ans%mod+mod)%mod<<'\n';
}
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...