社区讨论
线段树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 条回复,欢迎继续交流。
正在加载回复...