RE 0pts please HELP!
  • 板块P1471 方差
  • 楼主BantM
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/17 21:14
  • 上次更新2023/11/2 13:10:57
查看原帖
RE 0pts please HELP!
389729
BantM楼主2023/10/17 21:14

invalid memory reference

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e5+7;
const int inf=0x6f6f6f;
const int hs=10000019;
int n,a[maxn],m;


//函数
int sum[4*maxn];
int sum2[4*maxn];
int add[4*maxn];
inline int ls(int a){
	return 2*a;
}
inline int rs(int a){
	return 2*a+1;
}
inline void pushup(int a){
	sum[a]=sum[ls(a)]+sum[rs(a)];
	sum2[a]=sum2[ls(a)]+sum2[rs(a)];
}
void build(int l,int r,int p){
	add[p]=0;
	if(l==r){
		sum[p]=a[l];
		sum2[p]=a[l]*a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	pushup(p);
	return;
}
void f(int l,int r,int p,int k){
	add[p]+=k;
	sum2[p]+=(r-l+1)*k*k+2*sum[p]*k;
	sum[p]+=k*(r-l+1);
	return;
}
void pushdown(int l,int r,int p){
	int mid=(l+r)/2;
	f(l,mid,ls(p),add[p]);
	f(mid+1,r,rs(p),add[p]);
	add[p]=0;
	return;
}
void ad(int nl,int nr,int l,int r,int p,int k){
	if(nl<=l&&r<=nr){
		add[p]+=k;
		sum2[p]+=(r-l+1)*k*k+2*sum[p]*k;
		sum[p]+=k*(r-l+1);
		return;
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(mid>=nl){
		ad(nl,nr,l,mid,ls(p),k);
	}
	if(mid<nr){
		ad(nl,nr,mid+1,r,rs(p),k);
	}
	pushup(p);
	return;	
}
int query(int nl,int nr,int l,int r,int p){
	int ret=0;
	if(nl<=l&&r<=nr){
		return sum[p];
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(mid>=nl){
		ret+=query(nl,nr,l,mid,ls(p));
	}
	if(mid<nr){
		ret+=query(nl,nr,mid+1,r,rs(p));
	}
	return ret;	
}
int query2(int nl,int nr,int l,int r,int p){
	int ret=0;
	if(nl<=l&&r<=nr){
		return sum2[p];
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(mid>=nl){
		ret+=query2(nl,nr,l,mid,ls(p));
	}
	if(mid<nr){
		ret+=query2(nl,nr,mid+1,r,rs(p));
	}
	return ret;	
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	while(m--){
		int opt=0,x=0,y=0,k=0;
		scanf("%lld",&opt);
		if(opt==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			ad(x,y,1,n,1,k);
		}
		else if(opt==2){
			scanf("%lld%lld",&x,&y);
			printf("%.4f\n",(float)query(x,y,1,n,1)/(float)(y-x+1));
		}
		else{
			scanf("%lld%lld",&x,&y);
			float tem=query(x,y,1,n,1);
			float tem2=query2(x,y,1,n,1);
			float num=y-x+1;
			//cout<<tem<<" "<<tem2<<endl;
			//cout<<num*(tem/num)*(tem/num)<<" "<<tem2<<" "<<-2*(tem/num)*tem<<endl;
			printf("%.4f\n",(num*(tem/num)*(tem/num)+tem2-2*(tem/num)*tem)/num);
		}
	}
	
	
	
	return 0;
}
2023/10/17 21:14
加载中...