P1471 WA 0pts
  • 板块P1471 方差
  • 楼主Double_Light
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/2 12:35
  • 上次更新2023/12/2 14:53:37
查看原帖
P1471 WA 0pts
761137
Double_Light楼主2023/12/2 12:35

只能过样例

#include<iostream>
#define mid ((l+r)/2)
using namespace std;
int n,m,opt,xx,yy,k;
double a[100005];
struct tree{
	double sum,tag; 
	double squ,tag_squ;
}tr[800005];
void pushup(int x){
	tr[x].sum=tr[x*2].sum+tr[x*2+1].sum;
	tr[x].squ=tr[x*2].squ+tr[x*2+1].squ;
}
void pushdown(int x,int l,int r){
	if(tr[x].tag_squ!=0.0){
		tr[2*x].tag_squ+=tr[x].tag_squ;
		tr[2*x+1].tag_squ+=tr[x].tag_squ;
		tr[2*x].squ+=tr[2*x].sum*(tr[x].tag_squ*2)+(mid-l+1)*(tr[x].tag_squ*tr[x].tag_squ);
		tr[2*x+1].squ+=tr[2*x+1].sum*(tr[x].tag_squ*2)+(r-mid)*(tr[x].tag_squ*tr[x].tag_squ);
		tr[x].tag_squ=0;
		tr[2*x].tag+=tr[x].tag;
		tr[2*x+1].tag+=tr[x].tag;
		tr[2*x].sum+=tr[x].tag*(mid-l+1);
		tr[2*x+1].sum+=tr[x].tag*(r-mid);
		tr[x].tag=0;
	}
}
void build(int x,int l,int r){
	if(l==r){
		tr[x].sum=a[l];
		tr[x].squ=a[l]*a[l];
		return ;
	}
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	pushup(x);
}
double query_ave(int x,int l,int r,int from,int to){
	double ans=0;
	if(from<=l&&r<=to){
		ans=tr[x].sum;
		return ans;
	}
	pushdown(x,l,r);
	if(from<=mid)ans+=query_ave(x*2,l,mid,from,to);
	if(mid<to)ans+=query_ave(x*2+1,mid+1,r,from,to);
	return ans;
}
double query_squ(int x,int l,int r,int from,int to){
	double ans=0;
	if(from<=l&&r<=to){
		ans=tr[x].squ;
		return ans;
	}
	pushdown(x,l,r);
	if(from<=mid)ans+=query_squ(x*2,l,mid,from,to);
	if(mid<to)ans+=query_squ(x*2+1,mid+1,r,from,to);
	return ans;
}
void update(int x,int l,int r,int from,int to,double v){
	if(from<=l&&r<=to){
		tr[x].tag_squ+=v;
		tr[x].squ+=tr[x].sum*(v*2)+(r-l+1)*v*v;
		tr[x].tag+=v;
		tr[x].sum+=(r-l+1)*v;
		return ;
	}
	pushdown(x,l,r);
	if(from<=mid)update(x*2,l,mid,from,to,v);
	if(mid<to)update(x*2+1,mid+1,r,from,to,v);
	pushup(x);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>opt;
		if(opt==1){
			cin>>xx>>yy>>k;
			update(1,1,n,xx,yy,k);
		}
		if(opt==2){
			cin>>xx>>yy;
			printf("%.4lf\n",query_ave(1,1,n,xx,yy)*1.0/(yy-xx+1));
		}
		if(opt==3){
			cin>>xx>>yy;
			double p=query_squ(1,1,n,xx,yy)*1.0/(yy-xx+1),q=query_ave(1,1,n,xx,yy)*1.0/(yy-xx+1);
			double ans=p-q*q;
			printf("%.4lf\n",ans*1.0);
		}
	}
	return 0;
}
/*
1 5 4 2 3

2 5 4 2 3

2 4 4 2 3
*/
2023/12/2 12:35
加载中...