MnZn玄关求调,10pts
  • 板块P1471 方差
  • 楼主Ciallos
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/26 20:52
  • 上次更新2023/11/2 17:58:05
查看原帖
MnZn玄关求调,10pts
115252
Ciallos楼主2023/9/26 20:52

正常思路

#include <bits/stdc++.h>
#define N 500005
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
int n,m;
double a[N];
struct apple{
	int l,r;
	double sum2,sum,add;
};
apple t[N<<2];

#define l(x) t[x].l
#define r(x) t[x].r
#define sum2(x) t[x].sum2
#define sum(x) t[x].sum
#define add(x) t[x].add

void build(int p,int l,int r){
	l(p)=l,r(p)=r;
	if (l==r){
		sum(p)=a[l];
		sum2(p)=a[l]*a[l];
		return;
	}
	int mid=l(p)+r(p)>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    sum(p)=sum(ls(p))+sum(rs(p));
    sum2(p)=sum2(ls(p))+sum2(rs(p));
}

void push_down(int p){
	if (add(p)!=0){
		sum2(ls(p))+=1.0*(r(ls(p))-l(ls(p))+1)*add(p)*add(p)+2*sum(ls(p))*add(p);
		sum(ls(p))+=1.0*(r(ls(p))-l(ls(p))+1)*add(p);
		sum2(rs(p))+=1.0*(r(rs(p))-l(rs(p))+1)*add(p)*add(p)+2*sum(rs(p))*add(p);
		sum(rs(p))+=1.0*(r(rs(p))-l(rs(p))+1)*add(p);
		add(ls(p))+=add(p);
		add(rs(p))+=add(p);
		add(p)=0;
	}
}

void modify(int p,int l,int r,double k){
	if (l<=l(p)&&r(p)<=r){
		sum2(p)+=1.0*(r(p)-l(p)+1)*k*k+2*sum(p)*k;
		sum(p)+=1.0*(r(p)-l(p)+1)*k;
		add(p)+=k;
		return;
	}
	int mid=l(p)+r(p)>>1;
	if (l<=mid){
		modify(ls(p),l,r,k);
	}
	if (mid<r){
		modify(rs(p),l,r,k);
	}
	sum(p)=sum(ls(p))+sum(rs(p));
    sum2(p)=sum2(ls(p))+sum2(rs(p));
}

double query(int p,int l,int r){
	if (l<=l(p)&&r(p)<=r){
		return sum(p);
	}
	push_down(p);
	int mid=l(p)+r(p)>>1;
	double ans=0;
	if (l<=mid){
		ans+=query(ls(p),l,r);
	}
	if (mid<r){
		ans+=query(rs(p),l,r);
	}
	return ans;
}

double query2(int p,int l,int r){
	if (l<=l(p)&&r(p)<=r){
		return sum2(p);
	}
	push_down(p);
	int mid=l(p)+r(p)>>1;
	double ans=0;
	if (l<=mid){
		ans+=query2(ls(p),l,r);
	}
	if (mid<r){
		ans+=query2(rs(p),l,r);
	}
	return ans;
}

void dfs(int p){
	cout<<p<<" "<<l(p)<<" "<<r(p)<<" "<<sum(p)<<" "<<sum2(p)<<" "<<add(p)<<endl;
	if (l(p)==r(p)) return;
	dfs(ls(p)),dfs(rs(p));
}

signed main (){
	int i,op,c,d;
	double e,k,k2,avg;
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++){
		scanf("%lf",&a[i]);
	}
	build(1,1,n);
	for (i=1;i<=m;i++){
		scanf("%d%d%d",&op,&c,&d);
		if (op==1){
			scanf("%lf",&e);
			modify(1,c,d,e);
		}
		if (op==2){
			k=query(1,c,d);
			printf("%.4lf\n",k/(d-c+1));
		}
		if (op==3){
			//dfs(1);
			k=query(1,c,d),k2=query2(1,c,d);
			avg=1.0*k/(d-c+1);
			printf("%.4lf\n",1.0*(k2-2*avg*k+avg*avg*(d-c+1))/(d-c+1));
		}
	}
	return 0;
}
2023/9/26 20:52
加载中...