社区讨论

过不了样例,找不到哪里错了

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 条回复,欢迎继续交流。

正在加载回复...