这是哪里的问题呀
查看原帖
这是哪里的问题呀
1057883
xiguapijiayou楼主2025/8/29 09:02

蒟蒻WA了,有没有大佬帮忙看一下qwq

#include <bits/stdc++.h>
#define ll long long
#define ls p<<1
#define rs p<<1|1
using namespace std;
int n,m,a[100010];
struct NODE
{
	double sum1,sum2,add;
}t[400010];
void push_up(int p)
{
	t[p].sum1=t[ls].sum1+t[rs].sum1;
	t[p].sum2=t[ls].sum2+t[rs].sum2;
}
void build(int p,int l,int r)
{
	if(l==r)
	{
		t[p].sum1=a[l];
		t[p].sum2=a[l]*a[l];
		return;
	}
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
	push_up(p);
}
void push_down(int p,int l,int r)
{
	if(t[p].add!=0)
	{
		double add1=t[p].add;
		t[ls].add+=add1;
		t[rs].add+=add1;
		int mid=(l+r)/2;
		t[ls].sum2=t[ls].sum2+add1*2*t[ls].sum1+add1*add1*(mid-l+1);
		t[ls].sum1=t[ls].sum1+add1*(mid-l+1);
		
		t[rs].sum2=t[rs].sum2+add1*2*t[rs].sum1+add1*add1*(r-mid);
		t[rs].sum1=t[rs].sum1+add1*(r-mid);
		t[p].add=0;
	}
}
void modify(int p,int l,int r,int x,int y,int k)
{
	if(x<=l&&r<=y)
	{
		t[p].add+=k;
		t[p].sum2=t[p].sum2+2*k*t[p].sum1+k*k*(r-l+1);
		t[p].sum1+=k*(r-l+1);
		return;
	}
	int mid=(l+r)/2;
	push_down(p,l,r);
	if(x<=mid)
	{
		modify(ls,l,mid,x,y,k);
	}
	if(y>mid)
	{
		modify(rs,mid+1,r,x,y,k);
	}
	push_up(p);
}
NODE query(int p,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return t[p];
	}
	int mid=(l+r)/2;
	push_down(p,l,r);
	NODE res{0,0,0};
	if(x<=mid)
	{
        NODE left=query(ls,l,mid,x,y);
        res.sum1+=left.sum1;
        res.sum2+=left.sum2;
    }
    if(y>mid)
	{
        NODE right=query(rs,mid+1,r,x,y);
        res.sum1+=right.sum1;
        res.sum2+=right.sum2;
    }
	return res;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	while(m--)
	{
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1)
		{
			int k;
			cin>>k;
			modify(1,1,n,l,r,k);
		}
		if(op==2)
		{
			NODE ans=query(1,1,n,l,r);
			cout<<fixed<<setprecision(4)<<ans.sum1/(r-l+1)<<"\n";
		}
		if(op==3)
		{
			NODE ans=query(1,1,n,l,r);
			double res=ans.sum1/(r-l+1),len=r-l+1;
			//cout<<ans.sum1<<" "<<ans.sum2<<"\n";
			cout<<fixed<<setprecision(4)<<(ans.sum2-2*res*ans.sum1+res*res*(r-l+1))/len<<"\n";
		}
	}
    return 0;
}
2025/8/29 09:02
加载中...