社区讨论

样例未过,全RE,蒟蒻求调(玄关)

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

讨论操作

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

当前回复
10 条
当前快照
1 份
快照标识符
@mhjaxbas
此快照首次捕获于
2025/11/03 23:35
4 个月前
此快照最后确认于
2025/11/03 23:35
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<cmath>
#include<utility>
using namespace std;
const int maxn=100005;
double a[maxn];
struct Tree
{
	int l,r;
	double lazy;
	double sum1,sum2;
}tr[4*maxn];
void push_up(int id)
{
	tr[id].sum1=tr[id*2].sum1+tr[id*2+1].sum1;
	tr[id].sum2=tr[id*2].sum2+tr[id*2+1].sum2;
//	cout << 1 << ' ';
}
void push_down(int id)
{
	if(tr[id].lazy==0)
	{
		return ;
	}
	tr[id*2].sum2+=tr[id].lazy*tr[id].lazy*(tr[id*2].r-tr[id*2].l+1)+2*tr[id].lazy*tr[id*2].sum1;
	tr[id*2+1].sum2+=tr[id].lazy*tr[id].lazy*(tr[id*2+1].r-tr[id*2+1].l+1)+2*tr[id].lazy*tr[id*2+1].sum1;
	tr[id*2].sum1+=tr[id].lazy*(tr[id*2].r-tr[id*2].l+1);
	tr[id*2+1].sum1+=tr[id].lazy*(tr[id*2+1].r-tr[id*2+1].l+1);
	tr[id*2].lazy+=tr[id].lazy;
	tr[id*2+1].lazy+=tr[id].lazy;	
	tr[id].lazy=0;
//	cout << 2 << ' ';
}
void build(int id,int l,int r)
{
	if(l==r)
	{
		tr[id].sum1=a[l];
		tr[id].sum2=a[l]*a[l];
		tr[id].l=l;
		tr[id].r=r;
		return ;
	}
	int mid=(l+r)>>1;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	push_up(id);
//	cout << 3 << ' ';
}
void add(int id,int x,int y,double val)
{
	if(x<tr[id].l&&tr[id].r<y)
	{
		tr[id].sum2+=(tr[id].r-tr[id].l+1)*val*val+2*val*tr[id].sum1;
		tr[id].sum1+=(tr[id].r-tr[id].l+1)*val;
		tr[id].lazy+=val;
		return ;
	}
	push_down(id);
	int mid=(tr[id].l+tr[id].r)>>1;
	if(x<=mid)
	{
		add(id*2,x,y,val);
	}
	if(y>mid)
	{
		add(id*2+1,x,y,val);
	}
//	cout << 4 << ' ';
	push_up(id);
}
double find1(int id,int x,int y)
{
    if(x<=tr[id].l&&tr[id].r<=y)
    {
    	return tr[id].sum1;
	}
    push_down(id);
    int mid=(tr[id].l+tr[id].r)>>1;
    double ans=0;
    if(x<=mid)
    {
    	ans+=find1(id*2,x,y);
	}
    if(y>mid)
    {
    	ans+=find1(id*2+1,x,y);
	}
    return ans;
}
double find2(int id,int x,int y)
{
    if(x<=tr[id].l&&tr[id].r<=y)
    {
    	return tr[id].sum2;
	}
    push_down(id);
    int mid=(tr[id].l+tr[id].r)>>1;
    double ans=0;
    if(x<=mid)
    {
    	ans+=find2(id*2,x,y);
	}
    if(y>mid)
    {
    	ans+=find2(id*2+1,x,y);
	}
    return ans;
}
int main()
{
	int n,m;
	cin >> n >> m;
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
	}
	build(1,1,n);
	int op;
	int x,y;
	double k;
	for(int i=1;i<=m;i++)
	{
		cin >> op >> x >> y;
		if(op==1)
		{
			cin >> k;
			add(1,x,y,k);
		}
		else if(op==2)
		{
			printf("%.4lf\n",find1(1,x,y)/(y-x+1));
		}
		else
		{
			int t1=find1(1,x,y),t2=find2(1,x,y);
			printf("%.4lf\n",(t2-2*t1/(y-x+1)*t1+t1)/(y-x+1));
		}
	}
	return 0;
}
连续调了三个小时,还是没找到问题在哪。

回复

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

正在加载回复...