0分求助,样例过了
  • 板块P1471 方差
  • 楼主w13737245882
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/5/1 11:02
  • 上次更新2023/10/28 02:31:06
查看原帖
0分求助,样例过了
393977
w13737245882楼主2022/5/1 11:02
#include<bits/stdc++.h>
using namespace std;
#define ll long long
double a[1000009],ans[1000009],tag[10000009];
ll n,m;
inline ll ls(ll x)
{
	return x<<1;
}
inline ll rs(ll x)
{
	return x<<1|1;
}
inline void push_up(ll x)
{
	ans[x]=ans[ls(x)]+ans[rs(x)];
}
inline void f(ll x,ll l,ll r,ll k)
{
	tag[x]+=k;
	ans[x]+=k*(r-l+1);
}
inline void push_down(ll x,ll l,ll r)
{
	ll mid=(l+r)>>1;
	f(ls(x),l,mid,tag[x]);
	f(rs(x),mid+1,r,tag[x]);
	tag[x]=0;
}
void build(ll x,ll l,ll r)
{
	if(l==r)
	{
		ans[x]=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
	push_up(x);
}
void add(ll nl,ll nr,ll l,ll r,ll x,double k)
{
	if(nl<=l&&nr>=r)
	{
		ans[x]+=k*(r-l+1);
		tag[x]+=k;
		return ;
	}
	push_down(x,l,r);
	ll mid=(l+r)>>1;
	if(nl<=mid) add(nl,nr,l,mid,ls(x),k);
	if(nr>mid) add(nl,nr,mid+1,r,rs(x),k);
	push_up(x);
}
double dfs(ll nl,ll nr,ll l,ll r,ll x)
{
	double res=0;
	if(nl<=l&&nr>=r)
	{
		return ans[x];
	}
	ll mid=(l+r)>>1;
	push_down(x,l,r);
	if(nl<=mid) res+=dfs(nl,nr,l,mid,ls(x));
	if(nr>mid) res+=dfs(nl,nr,mid+1,r,rs(x));
	return res;
}
double fangcha(ll nl,ll nr,ll l,ll r,ll x)
{
	double res=0;
	if(nl<=l&&nr>=r&&l==r)
	{
		return ans[x]*ans[x];
	}
	ll mid=(l+r)>>1;
	push_down(x,l,r);
	if(nl<=mid) res+=fangcha(nl,nr,l,mid,ls(x));
	if(nr>mid) res+=fangcha(nl,nr,mid+1,r,rs(x));
	return res;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lf",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		ll a,x,y;
		double t,p,m,k;
		scanf("%lld%lld%lld",&a,&x,&y);
		if(a==1)
		{
			scanf("%lf",&k);
			add(x,y,1,n,1,k);
		}
		if(a==2)
		{
			p=dfs(x,y,1,n,1)/(y-x+1);
			printf("%.4lf\n",p);
		}
		if(a==3)
		{
			p=dfs(x,y,1,n,1)/(y-x+1); 
			t=(fangcha(x,y,1,n,1)-(y-x+1)*p*p)/(y-x+1);
			printf("%.4lf\n",t);
		}
	}
	return 0;
}
2022/5/1 11:02
加载中...