社区讨论

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 条回复,欢迎继续交流。

正在加载回复...