社区讨论

听取wa声一片,样例都没过,求大佬调试

P1471方差参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lzum3hgz
此快照首次捕获于
2024/08/15 09:38
2 年前
此快照最后确认于
2024/08/15 11:30
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-12;
double a[100010],d[401010],tag[400010],w,d1[400001];
int n,m,op,u,v;
void pushdown(int cur,int l,int r)
{
	if(fabs(tag[cur])>eps)
	{
		int mid=(l+r)>>1;
		d1[cur*2]+=2*tag[cur]*d[cur*2]+(mid-l+1)*tag[cur]*tag[cur];
		d1[cur*2+1]+=2*tag[cur]*d[cur*2+1]+(r-mid)*tag[cur]*tag[cur];
		d[cur*2]+=tag[cur]*(mid-l+1);
		d[cur*2+1]+=tag[cur]*(r-mid);
		tag[cur*2]+=tag[cur];
		tag[cur*2+1]+=tag[cur];
		tag[cur]=0;
	}
}
void build(int s,int t,int p)
{
    if (s==t) 
	{
        d[p]=a[s];
        d1[p]=a[s]*a[s];
        return;
    }
    int mid=(t+s)>>1;
    build(s,mid,p*2);
    build(mid+1,t,p*2+1);
    d[p]=d[p*2]+d[p*2+1];
    d1[p]=d1[p*2]+d1[p*2+1];
}
double query1(int l,int r,int s,int t,int p)
{
	if (l<=s&& t<=r)
    return d[p];
    int mid=(t+s)>>1;
    double sum=0;
    pushdown(p,s,t);
    if (l<=mid)sum+=query1(l,r,s,mid,p*2);
    if (r>mid)sum+=query1(l,r,mid+1,t,p*2+1);
    return sum;
}
double query2(int l,int r,int s,int t,int p)
{
	if (l<=s&& t<=r)
    return d1[p];
    int mid=(t+s)>>1;
    double sum=0;
    pushdown(p,s,t);
    if (l<=mid)sum+=query2(l,r,s,mid,p*2);
    if (r>mid)sum+=query2(l,r,mid+1,t,p*2+1);
    return sum;
}
void Modify(int l,int r,int s,int t,int p,double sum)
{
	int mid=(t+s)>>1;
	if(l<=s&&t<=r)
	{
		tag[p]+=sum;
		d[p]+=sum*(t-s+1);
		return;
	}
	pushdown(p,s,t);
	if (l<=mid)Modify(l,r,s,mid,p*2,sum);
    if (r>mid)Modify(l,r,mid+1,t,p*2+1,sum);
    d[p]=d[p*2]+d[p*2+1];
    d1[p]=d1[p*2]+d1[p*2+1];
} 
signed 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++)
	{
		cin>>op>>u>>v;
		if(op==1)
		{
			cin>>w;
			Modify(u,v,1,n,1,w);
		}
		else
		if(op==2)
		{
			cout<<fixed<<setprecision(4)<<query1(u,v,1,n,1)/(v-u+1)<<endl;
		}
		else
		if(op==3)
		{
			cout<<query2(u,v,1,n,1)<<" "<<query1(u,v,1,n,1)<<endl;
			double sum1=query2(u,v,1,n,1)/(v-u+1),sum2=query1(u,v,1,n,1)/(v-u+1);
            double ans=sum1-sum2*sum2;
            cout<<fixed<<setprecision(4)<<ans<<endl;
		 } 
	}
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...