10pts求调,看了其他帖子改了改没发现问题
  • 板块P5142 区间方差
  • 楼主Yao_
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/5 15:26
  • 上次更新2023/11/5 15:56:24
查看原帖
10pts求调,看了其他帖子改了改没发现问题
755166
Yao_楼主2023/11/5 15:26
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define all(x) x.begin(),x.end()
#define foo(i,a,b) for(int i=a;i<=b;i++)
#define fro(i,a,b) for(int i=a;i>=b;i--)
#define l(x) ((x)<<1)
#define r(x) ((x)<<1|1)
#define int long long
const int N=5e5+10;
typedef pair<int,int> PII;
typedef long long LL;
const int mod=1e9+7;
int n,m;
int a[N];
LL qmi(LL a,LL b)
{
	LL ans=1;
	while(b)
	{
		if(b&1)ans=ans*a%mod;
		a=(LL)a*a%mod;
		b>>=1;
	}
	return (ans%mod+mod)%mod;
}
struct
{
	int l,r;
	LL sum1,sum2;
}tr[4*N];
void pushup(int x)
{
	tr[x].sum1=((tr[l(x)].sum1+tr[r(x)].sum1)%mod+mod)%mod;
	tr[x].sum2=((tr[l(x)].sum2+tr[r(x)].sum2)%mod+mod)%mod;
}
void build(int x,int l,int r)
{
	tr[x].l=l,tr[x].r=r;
	if(l==r)
	{
		tr[x].sum1=((a[l])%mod+mod)%mod;
		tr[x].sum2=(((LL)a[l]*a[l])%mod+mod)%mod;
		return;
	}
	int mid=l+r>>1;
	build(l(x),l,mid);
	build(r(x),mid+1,r);
	pushup(x);
}
PII ask(int x,int l,int r)
{
	if(tr[x].l>=l&&tr[x].r<=r)return {tr[x].sum1%mod,tr[x].sum2%mod};
	int mid=tr[x].l+tr[x].r>>1;
	PII t={0ll,0ll};
	if(l<=mid)t=ask(l(x),l,r);
	if(r>mid)
	{
		auto j=ask(r(x),l,r);
		t.first=(((t.first+j.first))%mod+mod)%mod;
		t.second=(((t.second+j.second))%mod+mod)%mod;
	}
	return t;
}
int query(int x,int l,int r)
{
	PII t=ask(x,l,r);
	int sum1=t.first%mod,sum2=t.second%mod;
	//cout<<l<<' '<<r<<' '<<sum1<<' '<<sum2<<'\n';
	int n=r-l+1;
	LL n1=qmi(n,mod-2),n2=n1*n1%mod;
	assert(n1>=0&&n2>=0);
	//return (1.0*(LL)sum2/n-1.0*sum1*sum1/n/n);
	return ((LL)n*sum2-(LL)sum1*sum1)*n2%mod;
}
void change(int x,int k,int c)
{
	if(tr[x].l==tr[x].r)
	{
		tr[x].sum1=c%mod;
		tr[x].sum2=(LL)c*c%mod;
		return;
	}
	int mid=tr[x].l+tr[x].r>>1;
	if(k<=mid)change(l(x),k,c);
	else change(r(x),k,c);
	pushup(x);
}
signed main()
{
	ios::sync_with_stdio(false); cin.tie(0);
	cin>>n>>m;
	foo(i,1,n)cin>>a[i];
	build(1,1,n);
	int c,x,y;
	//cout<<n1<<' '<<n2<<'\n';
	while(m--)
	{
		cin>>c>>x>>y;
		if(c==1)change(1,x,y);
		else cout<<(query(1,x,y)%mod+mod)%mod<<'\n';
	}
}


2023/11/5 15:26
加载中...