社区讨论

0pts 马蜂亮好 代码求条

P1471方差参与者 4已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@mhjdkuid
此快照首次捕获于
2025/11/04 00:49
4 个月前
此快照最后确认于
2025/11/04 06:14
4 个月前
查看原帖
rt
sum 表示和,sqr 表示平方和
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m;
double a[N];
struct node{
	int l,r;
	double sum,sqr,tag;
}tr[N<<2];
#define lp p<<1
#define rp p<<1|1
inline void pushup(int p){
	tr[p].sum=tr[lp].sum+tr[rp].sum;
	tr[p].sqr=tr[lp].sqr+tr[rp].sqr; 
}
inline void pushdown(int p){
	if(!tr[p].tag)
		return;
	tr[lp].sqr+=2*tr[p].tag*tr[lp].sum+(tr[lp].r-tr[lp].l+1)*tr[p].tag*tr[p].tag;
	tr[lp].sum+=(tr[lp].r-tr[lp].l+1)*tr[p].tag; 
	tr[lp].tag+=tr[p].tag;
	tr[rp].sqr+=2*tr[p].tag*tr[rp].sum+(tr[rp].r-tr[rp].l+1)*tr[p].tag*tr[p].tag;
	tr[rp].sum+=(tr[rp].r-tr[rp].l+1)*tr[p].tag; 
	tr[rp].tag+=tr[p].tag;
}
void build(int p,int l,int r){
	tr[p].l=l,tr[p].r=r;
	if(l==r){
		tr[p].sum=a[l];
		tr[p].sqr=a[l]*a[l];
		return;
	} 
	int mid=l+r>>1;
	build(lp,l,mid);
	build(rp,mid+1,r);
	pushup(p);
}
void modify(int p,int l,int r,double v){
	if(tr[p].l>=l&&tr[p].r<=r){
		tr[p].sqr+=2*v*tr[p].sum+(r-l+1)*v*v;
		tr[p].sum+=(r-l+1)*v; 
		tr[p].tag+=v;
		return;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(l<=mid)
		modify(lp,l,r,v);
	if(r>mid)
		modify(rp,l,r,v);
	pushup(p); 
}
double query_sum(int p,int l,int r){
	if(l<=tr[p].l&&r>=tr[p].r)
		return tr[p].sum;
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	double ans=0;
	if(l<=mid)
		ans+=query_sum(lp,l,r);
	if(r>mid)
		ans+=query_sum(rp,l,r);
	return ans;
}
double query_sqr(int p,int l,int r){
	if(l<=tr[p].l&&r>=tr[p].r)
		return tr[p].sqr;
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	double ans=0;
	if(l<=mid)
		ans+=query_sqr(lp,l,r);
	if(r>mid)
		ans+=query_sqr(rp,l,r);
	return ans;
}
signed 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++){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			double k;
			cin>>k;
			modify(1,x,y,k);
		}
		if(op==2){
			printf("%.4lf\n",query_sum(1,x,y)/(y-x+1));
		}
		if(op==3){
			double tmp=query_sum(1,x,y)/(y-x+1);
			printf("%.4lf\n",(query_sqr(1,x,y)+(y-x+1)*tmp*tmp-2*tmp*query_sum(1,x,y))/(y-x+1));
		}
	}
	return 0;
}

回复

17 条回复,欢迎继续交流。

正在加载回复...