样例过了,全WA
  • 板块P1471 方差
  • 楼主crazy1003
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/4 19:18
  • 上次更新2024/11/4 19:26:23
查看原帖
样例过了,全WA
1047662
crazy1003楼主2024/11/4 19:18
#include<bits/stdc++.h>
#define lc q<<1
#define rc q<<1|1
using namespace std;
const int N=1e5+5;
double w[N];
int n,m,op,c1,c2;
double c3;
struct node{
	int l,r,len;
	double sum,psum;
	double add;
}tr[N*4];

void up(int q){
	tr[q].sum=tr[lc].sum+tr[rc].sum;
	tr[q].psum=tr[lc].psum+tr[rc].psum;
}

void lazy(int q){
	tr[q].psum=tr[q].psum+(2.0*tr[q].sum*tr[q].add)+((double)tr[q].len*tr[q].add*tr[q].add);
	tr[q].sum+=(double)tr[q].len*tr[q].add;
}

void down(int q){
	if(tr[q].add){
		tr[lc].add+=tr[q].add;
		tr[rc].add+=tr[q].add;
		lazy(lc);
		lazy(rc);
		tr[q].add=0;
	}
}

void build(int q,int l,int r){
	tr[q].l=l,tr[q].r=r;
	tr[q].len=r-l+1;
	if(l==r){
		tr[q].sum=w[l];
		tr[q].psum=w[l]*w[l];
	} else {
		int mid=(l+r)/2;
		build(lc,l,mid);
		build(rc,mid+1,r);
		up(q);
	}
}

void queryadd(int q,int l,int r,double v){
	if(l<=tr[q].l&&tr[q].r<=r){
		tr[q].psum=tr[q].psum+(2.0*tr[q].sum*v)+((double)tr[q].len*v*v);
		tr[q].sum+=(double)tr[q].len*v;
		tr[q].add+=v;
	} else {
		down(q);
		int mid=(tr[q].l+tr[q].r)/2;
		if(l<=mid){
			queryadd(lc,l,r,v);
		}
		if(r>mid){
			queryadd(rc,l,r,v);
		}
		up(q);
	}
}

double querysum(int q,int l,int r){
	if(l<=tr[q].l&&tr[q].r<=r){
		return tr[q].sum;
	} else {
		down(q);
		int mid=(tr[q].l+tr[q].r)/2;
		double ans=0;
		if(l<=mid){
			ans+=querysum(lc,l,r);
		}
		if(r>mid){
			ans+=querysum(rc,l,r);
		}
		return ans;
	}
}

double queryqsum(int q,int l,int r){
	if(l<=tr[q].l&&tr[q].r<=r){
		return tr[q].psum;
	} else {
		down(q);
		int mid=(tr[q].l+tr[q].r)/2;
		double ans=0;
		if(l<=mid){
			ans+=queryqsum(lc,l,r);
		}
		if(r>mid){
			ans+=queryqsum(rc,l,r);
		}
		return ans;
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%lf",&w[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
    	cin>>op;
		if(op==1) scanf("%d%d%lf",&c1,&c2,&c3),queryadd(1,c1,c2,c3);
		if(op==2){
			scanf("%d%d",&c1,&c2);
			double s1=querysum(1,c1,c2)/(double)(c2-c1+1);
			printf("%.4lf",s1),cout<<'\n';
		}
		if(op==3){
			scanf("%d%d",&c1,&c2);
			double s2=queryqsum(1,c1,c2);
			double s3=querysum(1,c1,c2);
			double le=(double)(c2-c1+1);
			double s4=((s2*le)-(s3*s3))/(le*le);
			printf("%.4lf",s4),cout<<'\n';
		}
		for(int i=1;i<n*3;i++){
			down(i);
			cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].sum<<" "<<tr[i].psum<<endl;
		}
		cout<<"------"<<endl;
	}
	return 0;
}
2024/11/4 19:18
加载中...