样例过了,但0分
  • 板块P1471 方差
  • 楼主CarlosProvo
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/28 12:41
  • 上次更新2024/7/28 14:33:30
查看原帖
样例过了,但0分
890257
CarlosProvo楼主2024/7/28 12:41

致敬传奇OIer爆零王

#include<bits/stdc++.h>
#define ll double
#define ls p<<1
#define rs p<<1|1
using namespace std;
const int N=1e5+5;
struct node
{
	ll val1=0,val2=0,tag=0;
}t[500001];//val1,val2分别维护区间和、区间平方和
int n,m;
ll a[100001];
void push_up(int p)
{
	t[p].val1=t[ls].val1+t[rs].val1;
	t[p].val2=t[ls].val2+t[rs].val2;
}
void build(int p,int l,int r)
{
	if(l==r)
	{
		t[p].val1=a[l];
		t[p].val2=a[l]*a[l];
		return ;
	}
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	push_up(p);
}
void addtag(int p,int l,int r,ll k)
{
	t[p].val2+=2*k*t[p].val1+(r-l+1)*k*k;
	t[p].val1+=(r-l+1)*k;
	t[p].tag+=k;
}
void push_down(int p,int l,int r)
{
	if(t[p].tag)
	{
		int mid=l+r>>1;
		addtag(ls,l,mid,t[p].tag);
		addtag(rs,mid+1,r,t[p].tag);
		t[p].tag=0;
	}
}
void add(int x,int y,int p,int l,int r,ll k)
{
	if(x<=l&&r<=y)
	{
		addtag(p,l,r,k);
		return ;
	}
	int mid=l+r>>1;
	push_down(p,l,r);
	if(x<=mid)add(x,y,ls,l,mid,k);
	if(y>mid)add(x,y,rs,mid+1,r,k);
	push_up(p);
}
ll query1(int x,int y,int p,int l,int r)
{
	if(x<=l&&r<=y)return t[p].val1;
	int mid=l+r>>1;
	ll res=0;
	push_down(p,l,r);
	if(x<=mid)res+=query1(x,y,ls,l,mid);
	if(y>mid)res+=query1(x,y,rs,mid+1,r);
	return res;
}
ll query2(int x,int y,int p,int l,int r)
{
	if(x<=l&&r<=y)return t[p].val2;
	int mid=l+r>>1;
	ll res=0;
	push_down(p,l,r);
	if(x<=mid)res+=query2(x,y,ls,l,mid);
	if(y>mid)res+=query2(x,y,rs,mid+1,r);
	return res;
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--)
	{
		int cd,x,y,k;
		cin>>cd;
		if(cd==1)
		{
			cin>>x>>y>>k;
			add(x,y,1,1,n,k);
		}
		if(cd==2)
		{
			cin>>x>>y;
			printf("%.4lf\n",query1(x,y,1,1,n)/(y-x+1));
		}
		if(cd==3)
		{
			cin>>x>>y;
			ll sos=query2(x,y,1,1,n),sum=query1(x,y,1,1,n),ave=sum/(y-x+1);
			ll var=(sos-2*ave*sum)/n+ave*ave;
			printf("%.4lf\n",var);
		}
	}
	return 0;
} 
2024/7/28 12:41
加载中...