社区讨论

线段树10pts求调plz

P5142区间方差参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m2vtavl4
此快照首次捕获于
2024/10/30 19:47
去年
此快照最后确认于
2025/11/04 15:41
4 个月前
查看原帖
rt
直接写了区间修改当单点修改用)
Code:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,p=1e9+7;
int n,m;
int a[N],t1[N<<2],t2[N<<2],lz[N<<2];
int quick_pow(int a,int b){
	int res=1;
	while(b){
		if (b&1)res=res*a%p;
		a=a*a%p;
		b>>=1;
	}
	return res;
}
int inv(int x){return quick_pow(x,p-2);}
int ls(int o){return o<<1;}
int rs(int o){return o<<1|1;}
void f(int s,int e,int o,int x){
	t2[o]+=(2*x*t1[o]%p+(e-s+1)*x*x%p)%p;
	t1[o]=(e-s+1)*x%p;
	lz[o]+=x%p;
}
void push_up(int o){
	t1[o]=(t1[ls(o)]+t1[rs(o)])%p;
	t2[o]=(t2[ls(o)]+t2[rs(o)])%p;
}
void build(int s=1,int e=n,int o=1){
	if (s==e){
		t1[o]=a[s];
		t2[o]=a[s]*a[s];
		return;
	}
	int mid=(s+e)>>1;
	build(s,mid,ls(o));
	build(mid+1,e,rs(o));
	push_up(o);
}
void push_down(int s,int e,int o){
	if (!lz[o])return;
	int mid=(s+e)>>1;
	f(s,mid,ls(o),lz[o]);
	f(mid+1,e,rs(o),lz[o]);
	lz[o]=0;
}
void update(int l,int r,int x,int s=1,int e=n,int o=1){
	if (l<=s&&e<=r){
		f(s,e,o,x);
		return;
	}
	int mid=(s+e)>>1;
	push_down(s,e,o);
	if (mid>=l)update(l,r,x,s,mid,ls(o));
	if (mid+1<=r)update(l,r,x,mid+1,e,rs(o));
	push_up(o);
}
int query_sum(int l,int r,int s=1,int e=n,int o=1){
	if (l<=s&&e<=r){
		return t1[o];
	}
	int mid=(s+e)>>1,res=0;
	push_down(s,e,o);
	if (mid>=l)res=(res+query_sum(l,r,s,mid,ls(o)))%p;
	if (mid+1<=r)res=(res+query_sum(l,r,mid+1,e,rs(o)))%p;
	return res;
}
int query_mul(int l,int r,int s=1,int e=n,int o=1){
	if (l<=s&&e<=r){
		return t2[o];
	}
	int mid=(s+e)>>1,res=0;
	push_down(s,e,o);
	if (mid>=l)res=(res+query_mul(l,r,s,mid,ls(o)))%p;
	if (mid+1<=r)res=(res+query_mul(l,r,mid+1,e,rs(o)))%p;
	return res;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for (int i=1;i<=n;i++)cin>>a[i];
	build();
	for (int i=1;i<=m;i++){
		int op,x,y;
		cin>>op>>x>>y;
		if (op==1){
			update(x,x,y);
		}else if (op==2){
			int arg=query_sum(x,y)*inv(y-x+1)%p;
			int len=inv(y-x+1)%p;
			int res=(len*query_mul(x,y)%p)-(2*arg*len*query_sum(x,y)%p)+(arg*arg%p);
			res=(res%p+p)%p;
			cout<<res<<"\n";
		}
	}
}
AC on #1

回复

0 条回复,欢迎继续交流。

正在加载回复...