社区讨论
过不了样例,找不到哪里错了
P1471方差参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjshf0f
- 此快照首次捕获于
- 2025/11/04 07:46 4 个月前
- 此快照最后确认于
- 2025/11/04 07:46 4 个月前
CPP
#include<cstdio>
#define ls(p) p<<1
#define rs(p) p<<1|1
const int N=1e5+10;
int n,m;
int x,y,opt;
double k;
struct SGT{
double data[N],s[N<<2],sqr[N<<2],tag[N<<2];
inline void addtag(int p,double k){
tag[p]+=k;
}
inline void pushdown(int p,int pl,int pr){
if(tag[p]){
double tmp=s[p];
s[p]+=(pr-pl+1)*tag[p];
sqr[p]=sqr[p]+tmp*tag[p]*2+(pr-pl+1)*tag[p]*tag[p];
addtag(ls(p),tag[p]);
addtag(rs(p),tag[p]);
tag[p]=0;
}
}
inline void pushup(int p){
s[p]=s[ls(p)]+s[rs(p)];
sqr[p]=sqr[ls(p)]+sqr[rs(p)];
}
void build(int p,int pl,int pr){
tag[p]=0;
if(pl==pr){
s[p]=data[pl];
sqr[p]=data[pl]*data[pl];
return ;
}
int mid=pl+(pr-pl>>1);
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
pushup(p);
}
void modify(int p,int pl,int pr,int L,int R,double k){
pushdown(p,pl,pr);
if(L<=pl&&pr<=R){
addtag(p,k);
return ;
}
int mid=pl+(pr-pl>>1);
if(L<=mid)modify(ls(p),pl,mid,L,R,k);
if(mid<R)modify(rs(p),mid+1,pr,L,R,k);
pushup(p);
}
double qsum(int p,int pl,int pr,int L,int R){
pushdown(p,pl,pr);
if(L<=pl&&pr<=R){
return s[p];
}
int mid=pl+(pr-pl>>1);
double ret=0;
if(L<=mid)ret+=qsum(ls(p),pl,mid,L,R);
if(mid<R)ret+=qsum(rs(p),mid+1,pr,L,R);
return ret;
}
double qsqr(int p,int pl,int pr,int L,int R){
pushdown(p,pl,pr);
if(L<=pl&&pr<=R){
return sqr[p];
}
int mid=pl+(pr-pl>>1);
double ret=0;
if(L<=mid)ret+qsqr(ls(p),pl,mid,L,R);
if(mid<R)ret+=qsqr(rs(p),mid+1,pr,L,R);
return ret;
}
};
SGT st;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lf",&st.data[i]);
}
st.build(1,1,n);
while(m--){
scanf("%d%d%d",&opt,&x,&y);
if(opt==1){
scanf("%lf",&k);
st.modify(1,1,n,x,y,k);
}
else if(opt==2){
printf("%.4lf\n",st.qsum(1,1,n,x,y)/(y-x+1));
}
else{
double s=st.qsum(1,1,n,x,y);
double sqr=st.qsqr(1,1,n,x,y);
double average=s/(y-x+1);
printf("%.4lf\n",(sqr+(y-x+1)*average*average-2*s*average)/(y-x+1));
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...