0分求助
  • 板块P1471 方差
  • 楼主_ajthreac_
  • 当前回复9
  • 已保存回复9
  • 发布时间2020/5/14 22:39
  • 上次更新2023/11/7 02:27:15
查看原帖
0分求助
220524
_ajthreac_楼主2020/5/14 22:39

如题,喜提0pts求解

#define N 100010
int n,m;
double num[N];
struct Node {
	int l,r;
	double wei,sqr,tag;
}tr[N<<2];
inline int Len(int k){
	return tr[k].r-tr[k].l+1;
}
inline void Pushup(int k){
	tr[k].wei=tr[ls].wei+tr[rs].wei;
	tr[k].sqr=tr[ls].sqr+tr[rs].sqr;
}
void Build(int k,int l,int r){
	tr[k].l=l,tr[k].r=r,tr[k].tag=0;
	if(l==r){
		tr[k].wei=num[l];
		tr[k].sqr=tr[k].wei*tr[k].wei;
		return;
	}
	Build(ls,l,nmid);
	Build(rs,nmid+1,r);
	Pushup(k);
}
inline void Pushdn(int k){
	if(tr[k].tag){
		int len=Len(k);
		tr[ls].sqr+=2*tr[k].tag*tr[ls].wei+(len-len/2)*tr[k].tag*tr[k].tag;
		tr[rs].sqr+=2*tr[k].tag*tr[rs].wei+(len/2)*tr[k].tag*tr[k].tag;
		tr[ls].wei+=(len-len/2)*tr[k].tag;
		tr[rs].wei+=(len/2)*tr[k].tag;
		tr[ls].tag+=tr[k].tag;
		tr[rs].tag+=tr[k].tag;
		tr[k].tag=0;
	}
}
void Modify(int k,int l,int r,double add){
	if(l<=tr[k].l&&tr[k].r<=r){
		tr[k].tag+=add;
		tr[k].sqr+=2*add*tr[k].wei+add*add*Len(k);
		tr[k].wei+=add*Len(k);
		return;
	}
	Pushdn(k);
	if(l<=tmid)Modify(ls,l,r,add);
	if(tmid+1<=r)Modify(rs,l,r,add);
	Pushup(k);
}
double Queryw(int k,int l,int r){
	if(l<=tr[k].l&&tr[k].r<=r){
		return tr[k].wei;
	}
	double ans=0;
	if(l<=tmid)ans+=Queryw(ls,l,r);
	if(tmid<r)ans+=Queryw(rs,l,r);
	return ans;
}
double Querys(int k,int l,int r){
	if(l<=tr[k].l&&tr[k].r<=r){
		return tr[k].sqr;
	}
	double ans=0;
	if(l<=tmid)ans+=Querys(ls,l,r);
	if(tmid<r)ans+=Querys(rs,l,r);
	return ans;
}
int main(){
	Read(n),Read(m);
	for(rg int i=1;i<=n;i++)cin>>num[i];
	Build(1,1,n);
	for(rg int i=1;i<=m;i++){
		int opt,x,y;
		double k;
		Read(opt),Read(x),Read(y);
		if(opt==1){
			cin>>k;
			Modify(1,x,y,k);
		}else if(opt==2){
			printf("%.4lf\n",Queryw(1,x,y)/(y-x+1));
		}else {
			double sum=Querys(1,x,y)/(y-x+1),avr=Queryw(1,x,y)/(y-x+1);
			printf("%.4lf\n",sum-avr*avr);
		}
	}
	return 0;
}
2020/5/14 22:39
加载中...