求调
  • 板块灌水区
  • 楼主yhy2024
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/4 18:49
  • 上次更新2024/8/4 20:11:29
查看原帖
求调
1262406
yhy2024楼主2024/8/4 18:49

题目

#include<bits/stdc++.h>
#define N 100005
using namespace std;
double sum_1[N*4],sum_2[N*4],n,m,a[N],lazy[N*4],op,l1,r1,v1;
void pushup(int k){
	sum_1[k]=sum_1[k<<1]+sum_1[k<<1|1];
	sum_2[k]=sum_2[k<<1]+sum_2[k<<1|1];
}
void add(int k,int l,int r,double v){
	sum_2[k]+=2*v*sum_1[k]+(r-l+1)*v*v;
	sum_1[k]+=(r-l+1)*v;
	lazy[k]+=v;
} 
void pushdown(int k,int l,int r){
	if(lazy[k]==0){
		return;
	}
	int mid=(l+r)>>1;
	add(k<<1,l,mid,lazy[k]);
	add(k<<1|1,mid+1,r,lazy[k]);
	lazy[k]=0;
}
void build(int k,int l,int r){
	if(l==r){
		sum_1[k]=a[l];
		sum_2[k]=a[l]*a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	pushup(k); 
} 
void modify(int k,int l,int r,int x,int y,double v){
	if(r<x||l>y) return;
	if(x<=l&&r<=y){
		add(k,l,r,v);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(k,l,r);
	modify(k<<1,l,mid,x,y,v);
	modify(k<<1|1,mid+1,r,x,y,v);
	pushup(k);
} 
int query_variance(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		return sum_2[k];
	}
	pushdown(k,l,r);
	int mid=(l+r)>>1;
	double res=0;
	if(x<=mid) res+=query_variance(k<<1,l,mid,x,y);
	if(mid<y) res+=query_variance(k<<1|1,mid+1,r,x,y);
	return res;
}
int query_Average_number(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		return sum_1[k];
	}
	pushdown(k,l,r);
	int mid=(l+r)>>1;
	double res=0;
	if(x<=mid) res+=query_Average_number(k<<1,l,mid,x,y);
	if(mid<y) res+=query_Average_number(k<<1|1,mid+1,r,x,y);
	pushup(k);
	return res; 
}
main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	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>>op;
		if(op==1){
			cin>>l1>>r1>>v1;
			modify(1,1,n,l1,r1,v1);
		} 
		else if(op==2){
			cin>>l1>>r1;
			double Average_number=1.0*query_Average_number(1,1,n,l1,r1)/(r1-l1+1);
			printf("%.4lf\n",Average_number);
		}
		else if(op==3){
			cin>>l1>>r1;
			double Average_number=1.0*query_Average_number(1,1,n,l1,r1)/(r1-l1+1);
			double variance=1.0*query_variance(1,1,n,l1,r1)/(r1-l1+ 1)-Average_number*Average_number;
			printf("%.4lf\n",variance);
			
		}
	}
} 
2024/8/4 18:49
加载中...