样例过了但是WA0分求助
  • 板块P1471 方差
  • 楼主sms123
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/5 14:08
  • 上次更新2024/7/5 15:18:31
查看原帖
样例过了但是WA0分求助
596783
sms123楼主2024/7/5 14:08

萌新求助,所有的警钟都看了,还是没找到问题

#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define lp p*2
#define rp p*2+1
#define mid ((l+r)>>1)
int n,m,op,x,y;
double a[N],t1[N<<3],t2[N<<3],lazy[N<<3],t,k;
void pushup(int p){
	t1[p]=t1[lp]+t1[rp],t2[p]=t2[lp]+t2[rp];
}void build(int p,int l,int r){
	if(l==r)t1[p]=a[l],t2[p]=a[l]*a[l];
	else build(lp,l,mid),build(rp,mid+1,r),pushup(p);
}void pushdown(int p,int l,int r){
	t2[lp]+=2.0*lazy[p]*t1[lp]+double(mid-l+1)*lazy[p]*lazy[p];
	t1[lp]+=(mid-l+1)*lazy[p],lazy[lp]+=lazy[p];
	t2[rp]+=2.0*lazy[p]*t1[rp]+double(r-mid)*lazy[p]*lazy[p];
	t1[rp]+=(r-mid)*lazy[p],lazy[rp]+=lazy[p];
	lazy[p]=0;
}void update(int p,int l,int r,int L,int R,double v){
	if(L<=l&&r<=R){
		t2[p]+=2.0*v*t1[p]+double(R-L+1)*v*v;
		t1[p]+=double(R-L+1)*v,lazy[p]+=v;
		return;
	}pushdown(p,l,r);
	if(L<=mid)update(lp,l,mid,L,R,v);
	if(R>mid)update(rp,mid+1,r,L,R,v);
	pushup(p);
}double query1(int p,int l,int r,int L,int R){
	if(L<=l&&r<=R)return t1[p];
	pushdown(p,l,r);
	double sum=0;
	if(L<=mid)sum+=query1(lp,l,mid,L,R);
	if(R>mid)sum+=query1(rp,mid+1,r,L,R);
	pushup(p);
	return sum;
}double query2(int p,int l,int r,int L,int R){
	if(L<=l&&r<=R)return t2[p];
	pushdown(p,l,r);
	double sum=0;
	if(L<=mid)sum+=query2(lp,l,mid,L,R);
	if(R>mid)sum+=query2(rp,mid+1,r,L,R);
	pushup(p);
	return sum;
}int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		cin>>op>>x>>y;
		if(op==1)cin>>k,update(1,1,n,x,y,k);
		if(op==2)printf("%.4lf\n",query1(1,1,n,x,y)/double(y-x+1));
		if(op==3)t=query1(1,1,n,x,y)/double(y-x+1),printf("%.4lf\n",-t*t+query2(1,1,n,x,y)/double(y-x+1));
	}return 0;
}
2024/7/5 14:08
加载中...