求助
  • 板块P1471 方差
  • 楼主黑影洞人
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/11/1 22:13
  • 上次更新2023/11/4 01:36:18
查看原帖
求助
285617
黑影洞人楼主2021/11/1 22:13
#include<cstdio>
#include<algorithm>
#define N 400005
#define int long long
#define dou double
#define lc p<<1
#define rc p<<1|1
#define mm (l+r)/2
using namespace std;
struct segementtree{
	int l,r;
	dou su,pf,v;
}s[N]; 
int n,m;
void pushup(int p){
	s[p].su=(s[lc].su+s[rc].su);
	s[p].pf=(s[lc].pf+s[rc].pf);
}
void pushdown(int p){
	if(s[p].v==0)return;
	int x=s[p].l,y=s[p].r;
	dou v=s[p].v;
	int mid=(x+y)/2;
	s[lc].pf+=1.0*(mid-x+1)*v*v+2.0*s[lc].su*v;
	s[rc].pf+=1.0*(y-mid)*v*v+2.0*v*s[rc].su;
	s[lc].su+=1.0*(mid-x+1)*v;
	s[rc].su+=1.0*(y-mid)*v;
	s[lc].v+=v;s[rc].v+=v;
	s[p].v=0;
} 
void build(int p,int l,int r){
	s[p].l=l,s[p].r=r;
	if(l==r){
		dou a;
		scanf("%lf",&a);
		s[p].su=a;
		s[p].pf=a*a;
	//	s[p].v=0;
		return;
	}
	build(lc,l,mm);
	build(rc,mm+1,r);
	pushup(p);
}
void add(int p,int l,int r,dou v){
	if(s[p].l>r||s[p].r<l)return;
	if(s[p].l>=l&&s[p].r<=r){
		s[p].pf+=(r-l+1)*v*v+2.0*s[p].su*v;
		s[p].su+=(r-l+1)*v;
		s[p].v+=v;
		//pushdown(p);
		return;
	}
	pushdown(p);
	add(lc,l,r,v);add(rc,l,r,v);
	pushup(p);
}
dou querys(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return 0;
	if(s[p].l>=l&&s[p].r<=r)return s[p].su;
	pushdown(p);
	return (querys(lc,l,r)+querys(rc,l,r)); 
}
dou queryp(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return 0;
	if(s[p].l>=l&&s[p].r<=r)return s[p].pf;
	pushdown(p);
	return (queryp(lc,l,r)+queryp(rc,l,r)); 
}
signed main(){
	scanf("%lld%lld",&n,&m);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int c,l,r;dou dd;
		scanf("%lld%lld%lld",&c,&l,&r);
		if(c==1)scanf("%lf",&dd),add(1,l,r,dd);
		else if(c==2){
			dou a=querys(1,l,r);
			printf("%.4lf\n",1.0*a/(r-l+1));
		}
		else {
			dou a=querys(1,l,r)/(r-l+1),b=queryp(1,l,r);
			dou biv=(1.0*b/(r-l+1))-1.0*a*a;
			printf("%.4lf\n",biv);
		}
	}
	return 0;
}


2021/11/1 22:13
加载中...