社区讨论
0pts 马蜂亮好 代码求条
P1471方差参与者 4已保存回复 17
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 17 条
- 当前快照
- 1 份
- 快照标识符
- @mhjdkuid
- 此快照首次捕获于
- 2025/11/04 00:49 4 个月前
- 此快照最后确认于
- 2025/11/04 06:14 4 个月前
rt
sum 表示和,sqr 表示平方和
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m;
double a[N];
struct node{
int l,r;
double sum,sqr,tag;
}tr[N<<2];
#define lp p<<1
#define rp p<<1|1
inline void pushup(int p){
tr[p].sum=tr[lp].sum+tr[rp].sum;
tr[p].sqr=tr[lp].sqr+tr[rp].sqr;
}
inline void pushdown(int p){
if(!tr[p].tag)
return;
tr[lp].sqr+=2*tr[p].tag*tr[lp].sum+(tr[lp].r-tr[lp].l+1)*tr[p].tag*tr[p].tag;
tr[lp].sum+=(tr[lp].r-tr[lp].l+1)*tr[p].tag;
tr[lp].tag+=tr[p].tag;
tr[rp].sqr+=2*tr[p].tag*tr[rp].sum+(tr[rp].r-tr[rp].l+1)*tr[p].tag*tr[p].tag;
tr[rp].sum+=(tr[rp].r-tr[rp].l+1)*tr[p].tag;
tr[rp].tag+=tr[p].tag;
}
void build(int p,int l,int r){
tr[p].l=l,tr[p].r=r;
if(l==r){
tr[p].sum=a[l];
tr[p].sqr=a[l]*a[l];
return;
}
int mid=l+r>>1;
build(lp,l,mid);
build(rp,mid+1,r);
pushup(p);
}
void modify(int p,int l,int r,double v){
if(tr[p].l>=l&&tr[p].r<=r){
tr[p].sqr+=2*v*tr[p].sum+(r-l+1)*v*v;
tr[p].sum+=(r-l+1)*v;
tr[p].tag+=v;
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid)
modify(lp,l,r,v);
if(r>mid)
modify(rp,l,r,v);
pushup(p);
}
double query_sum(int p,int l,int r){
if(l<=tr[p].l&&r>=tr[p].r)
return tr[p].sum;
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
double ans=0;
if(l<=mid)
ans+=query_sum(lp,l,r);
if(r>mid)
ans+=query_sum(rp,l,r);
return ans;
}
double query_sqr(int p,int l,int r){
if(l<=tr[p].l&&r>=tr[p].r)
return tr[p].sqr;
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
double ans=0;
if(l<=mid)
ans+=query_sqr(lp,l,r);
if(r>mid)
ans+=query_sqr(rp,l,r);
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int op,x,y;
cin>>op>>x>>y;
if(op==1){
double k;
cin>>k;
modify(1,x,y,k);
}
if(op==2){
printf("%.4lf\n",query_sum(1,x,y)/(y-x+1));
}
if(op==3){
double tmp=query_sum(1,x,y)/(y-x+1);
printf("%.4lf\n",(query_sqr(1,x,y)+(y-x+1)*tmp*tmp-2*tmp*query_sum(1,x,y))/(y-x+1));
}
}
return 0;
}
回复
共 17 条回复,欢迎继续交流。
正在加载回复...