社区讨论

40WA求助

P1471方差参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m1j1sggb
此快照首次捕获于
2024/09/26 16:44
去年
此快照最后确认于
2024/09/26 20:15
去年
查看原帖
CPP
#include <bits/stdc++.h>
#define MAX 100001
#define int long long
using namespace std;
int n,m;
double a[MAX];
struct node{
	int l,r;
	double sum,powsum,tag;
}t[MAX<<2];
void build(int x, int l, int r) {
	t[x].l=l,t[x].r=r;
	if (t[x].l==t[x].r) {
		t[x].sum=a[l];
		t[x].powsum=a[l]*a[l];
		return ;
	}
	int mid=(t[x].l+t[x].r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	t[x].sum=t[x<<1].sum+t[x<<1|1].sum;
	t[x].powsum=t[x<<1].powsum+t[x<<1|1].powsum; 
}
void lazy_work(int pos, double val) {
	t[pos].tag+=val;
	t[pos].powsum+=2.0*val*t[pos].sum+t[pos].tag*t[pos].tag*(t[pos].r-t[pos].l+1);
	t[pos].sum+=val*(t[pos].r-t[pos].l+1);
}
void push_down(int x) {
	if (!t[x].tag) return ;
	lazy_work(x<<1,t[x].tag);
	lazy_work(x<<1|1,t[x].tag);
	t[x].tag=0.0;
}
void update(int x, int l, int r, double v) {
	if (l<=t[x].l&&t[x].r<=r) {
		t[x].tag+=v;
		t[x].powsum+=2.0*v*t[x].sum+v*v*(t[x].r-t[x].l+1);
		t[x].sum+=v*(1.0*(t[x].r-t[x].l+1));
		return ;
	}
	int mid=(t[x].l+t[x].r)>>1;
	push_down(x);
	if (l<=mid) update(x<<1,l,r,v);
	if (r>mid) update(x<<1|1,l,r,v);
	t[x].sum=t[x<<1].sum+t[x<<1|1].sum;
	t[x].powsum=t[x<<1].powsum+t[x<<1|1].powsum; 
}
double query1(int x, int l, int r) {
	if (l<=t[x].l&&t[x].r<=r) return t[x].sum;
	push_down(x);
	int mid=(t[x].l+t[x].r)>>1;
	double ans=0.0;
	if (l<=mid) ans+=query1(x<<1,l,r);
	if (r>mid) ans+=query1(x<<1|1,l,r);
	return ans;
}
double query2(int x, int l, int r) {
	if (l<=t[x].l&&t[x].r<=r) return t[x].powsum;
	push_down(x);
	int mid=(t[x].l+t[x].r)>>1;
	double ans=0.0;
	if (l<=mid) ans+=query2(x<<1,l,r);
	if (r>mid) ans+=query2(x<<1|1,l,r);
	return ans;
}
signed main(){
	cin >> n >> m;
	for (int i=1;i<=n;i++) cin >> a[i];
	build(1,1,n);
	while(m--) {
		int op,l,r;
		double k;
		cin >> op >> l >> r;
		if (op==1) {
			cin >> k;
			update(1,l,r,k);
		}
		else if (op==2) {
			cout << fixed << setprecision(4) << query1(1,l,r)*1.0/(r-l+1) << endl;
		}
		else {
			double now=query1(1,l,r)*1.0/(r-l+1);
			double ans=query2(1,l,r)*1.0/(r-l+1)-now*now;
			cout << fixed << setprecision(4) << ans << endl;
		}
	}
	return 0;
}

回复

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

正在加载回复...