求调,玄关样例最后一个
  • 板块P1471 方差
  • 楼主qinzixu
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/14 18:50
  • 上次更新2024/10/14 20:35:55
查看原帖
求调,玄关样例最后一个
1205369
qinzixu楼主2024/10/14 18:50
#include<bits/stdc++.h>
using namespace std;
#define lz p<<1
#define rz p<<1|1
#define mid (l+r)/2
const int N=1e5+10;
double n,m,a[N],tr[N*4],tr2[N*4],tag[N*4];

void build(int l,int r,int p)
{
	if(l==r){
		tr[p]=a[l];
		tr2[p]=a[l]*a[l];
		return;
	}
	build(l,mid,lz);
	build(mid+1,r,rz);
	tr[p]+=tr[lz]+tr[rz];
	tr2[p]+=tr2[lz]+tr2[rz];
	return;
}

void down(int l,int r,int p){
	tag[rz]+=tag[p];
	tag[lz]+=tag[p];
	tr2[lz]+=2*tag[p]*tr[lz]+(mid-l+1)*tag[p]*tag[p];
	tr2[rz]+=2*tag[p]*tr[rz]+(r-mid)*tag[p]*tag[p];
	tr[lz]+=tag[p]*(mid-l+1);
	tr[rz]+=tag[p]*(r-mid);
	tag[p]=0;
}

void update(int bg,int ed,double k,int l,int r,int p)
{
	if(bg<=l&&ed>=r){
		tr2[p]+=tr[p]*2*k+k*k*(r-l+1);
		tr[p]+=(r-l+1)*k;
		tag[p]+=k;
		return;
	}
	down(l,r,p);
	if(bg<=mid)update(bg,ed,k,l,mid,lz);
	if(ed>mid)update(bg,ed,k,mid+1,r,rz);
} 

double getsum2(int bg,int ed,int l,int r,int p)
{
	down(l,r,p);
	if(bg<=l&&r<=ed)return tr[p];
	double sum=0;
	if(bg<=mid)sum=getsum2(bg,ed,l,mid,lz);
	if(ed>mid)sum+=getsum2(bg,ed,mid+1,r,rz);
	return sum;
}

double getsum3(int bg,int ed,int l,int r,int p)
{
	down(l,r,p);
	if(bg<=l&&r<=ed)return tr2[p];
	double sum=0;
	if(bg<=mid)sum=getsum3(bg,ed,l,mid,lz);
	if(ed>=mid)sum+=getsum3(bg,ed,mid+1,r,rz);
	return sum;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			double z;
			cin>>z;
			update(x,y,z,1,n,1);
			//for(int j=1;j<=n;j++)cout<<getsum3(j,j,1,n,1)<<" "; 
		}
		else if(op==2){
			printf("%.4lf\n",getsum2(x,y,1,n,1)/((y-x+1)*1.0));
		}
		else {
			double sum1=getsum3(x,y,1,n,1)/((y-x+1)*1.0);
			double sum2=getsum2(x,y,1,n,1)/((y-x+1)*1.0);
			//cout<<getsum3(x,y,1,n,1)<<" "<<sum1<<" "<<sum2;
			printf("%.4lf\n",sum1-sum2*sum2);
		}
	}
	return 0;
}
2024/10/14 18:50
加载中...