样例过了 WA 0pts 求调
  • 板块P1471 方差
  • 楼主_yang_yi_bo_
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/17 20:36
  • 上次更新2025/1/18 09:14:22
查看原帖
样例过了 WA 0pts 求调
1265919
_yang_yi_bo_楼主2025/1/17 20:36
#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1)
#define ls 2*k
#define rs 2*k+1
#define lk (mid-l+1)
#define rk (r-mid)
#define len (r-l+1)
#define db double
int n,m;
db a[500005],sum[500005],pfh[500005],add[500005];
void pushup(int k){
	sum[k]=sum[ls]+sum[rs];
	pfh[k]=pfh[ls]+pfh[rs];
}
void pushdown(int k,int l,int r){
	if(add[k]>0){
		pfh[ls]+=lk*add[k]*add[k]+2.0*add[k]*sum[ls],pfh[rs]+=rk*add[k]*add[k]+2.0*add[k]*sum[rs];
		sum[ls]+=lk*add[k],sum[rs]+=rk*add[k];
		add[ls]+=add[k],add[rs]+=add[k],add[0]=0;
	}
}
void init(int k,int l,int r){
	if(l==r){
		sum[k]=a[l],pfh[k]=a[l]*a[l];
		return;
	}init(ls,l,mid),init(rs,mid+1,r),pushup(k);
}
void up(int k,int l,int r,int L,int R,db v){
	if(L<=l&&r<=R){
		pfh[k]+=len*v*v+2*v*sum[k],sum[k]+=len*v,add[k]+=v;
		return;
	}pushdown(k,l,r);
	if(L<=mid)up(ls,l,mid,L,R,v);
	if(R>=mid+1)up(rs,mid+1,r,L,R,v);
	pushup(k);
}
db q1(int k,int l,int r,int L,int R){
	if(L<=l&&r<=R)return sum[k];
	pushdown(k,l,r);
	return (L<=mid?q1(ls,l,mid,L,R):0)+(R>=mid+1?q1(rs,mid+1,r,L,R):0);
}
db q2(int k,int l,int r,int L,int R){
	if(L<=l&&r<=R)return pfh[k];
	pushdown(k,l,r);
	return (L<=mid?q2(ls,l,mid,L,R):0)+(R>=mid+1?q2(rs,mid+1,r,L,R):0);
}
signed main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	init(1,1,n);  
	int op;
	for(double x,y,k;m--;m){
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			up(1,1,n,x,y,k);
		}else if(op==2){
			cin>>x>>y;
			cout<<fixed<<setprecision(4)<<q1(1,1,n,x,y)/(y-x+1)<<"\n";
		}else{
			cin>>x>>y;
			cout<<fixed<<setprecision(4)<<q2(1,1,n,x,y)/(y-x+1)-(q1(1,1,n,x,y)/(y-x+1)*q1(1,1,n,x,y)/(y-x+1))<<"\n";
		}
	}
	return 0;
}
2025/1/17 20:36
加载中...