萌新可爱线段树求调悬关
  • 板块P1471 方差
  • 楼主Rosent
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/24 00:01
  • 上次更新2023/11/2 18:24:39
查看原帖
萌新可爱线段树求调悬关
651793
Rosent楼主2023/9/24 00:01

rt,能过样例,但是WA 0pts

#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
double a[maxn],sum2[maxn*4],sum[maxn*4],addmark[maxn*4],addmark2[maxn*4];
int n,m;
void build(int k,int l,int r)
{
	if(l==r)
	{
		sum[k]=a[l];
		sum2[k]=a[l]*a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	sum[k]=sum[k*2]+sum[k*2+1];
	sum2[k]=sum2[k*2]+sum2[k*2+1];
}
void add1(int k,int l,int r,double v)
{
	addmark[k]+=v;
	sum[k]+=v*(r-l+1);
}
void add2(int k,int l,int r,double v)
{
	addmark2[k]+=v;
	sum2[k]+=sum[k]*2*v+v*v*(r-l+1);
}
void pushdown(int k,int l,int r)
{
	if(addmark[k]==0&&addmark2[k]==0) return ;
	int mid=(l+r)/2;
	add2(k*2,l,mid,addmark2[k*2]);
	add2(k*2+1,mid+1,r,addmark2[k*2+1]);
	add1(k*2,l,mid,addmark[k*2]);
	add1(k*2+1,mid+1,r,addmark[k*2+1]);
	addmark[k]=0.0;
	addmark2[k]=0.0;
}
void modify(int k,int l,int r,int x,int y,double v)
{
	if(l>=x&&r<=y)
	{
		add2(k,l,r,v);
		add1(k,l,r,v);
		return ;
	}
	int mid=(l+r)/2;
	pushdown(k,l,r);
	if(x<=mid)
	{
		modify(k*2,l,mid,x,y,v);
	}
	if(y>mid)
	{
		modify(k*2+1,mid+1,r,x,y,v);
	}
	sum[k]=sum[k*2]+sum[k*2+1];
	sum2[k]=sum2[k*2]+sum2[k*2+1];
}
double query(int k,int l,int r,int x,int y)
{
	if(l>=x&&r<=y)
	{
		return sum[k];
	}
	int mid=(l+r)/2;
	pushdown(k,l,r);
	double res=0.0;
	if(x<=mid)
	{
		res+=query(k*2,l,mid,x,y);
	}
	if(y>mid)
	{
		res+=query(k*2+1,mid+1,r,x,y);
	}
	return res;
}
double query2(int k,int l,int r,int x,int y)
{
	if(l>=x&&r<=y)
	{
		return sum2[k];
	}
	int mid=(l+r)/2;
	pushdown(k,l,r);
	double res=0.0;
	if(x<=mid)
	{
		res+=query2(k*2,l,mid,x,y);
	}
	if(y>mid)
	{
		res+=query2(k*2+1,mid+1,r,x,y);
	}
	return res;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int opt;
		cin>>opt;
		if(opt==1)
		{
			int x,y;
			double k;
			cin>>x>>y>>k;
			modify(1,1,n,x,y,k);
		}
		else if(opt==2)
		{
			int x,y;
			cin>>x>>y;
			printf("%.4lf\n",query(1,1,n,x,y)/(y-x+1));
		}
		else
		{
			int x,y;
			cin>>x>>y;
			double ab=query(1,1,n,x,y)/(y-x+1);
			printf("%.4lf\n",1.0/(y-x+1)*query2(1,1,n,x,y)-ab*ab);
		}
	}
	return 0;
}
2023/9/24 00:01
加载中...