样例全过,0分全RE求助
  • 板块P1471 方差
  • 楼主Assassin_HG
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/24 14:22
  • 上次更新2024/1/24 16:36:15
查看原帖
样例全过,0分全RE求助
667180
Assassin_HG楼主2024/1/24 14:22
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn], sum[maxn << 2], tag[maxn << 2];
int ls(int rt) {
	return rt << 1;
}
int rs(int rt) {
	return rt << 1 | 1;
}
void Push_up(int rt) {
	sum[rt] = sum[ls(rt)] + sum[rs(rt)];
}
void Add(int rt, int l, int r, int d) {
	sum[rt] += d * (r - l + 1);
	tag[rt] += d;
}
void Push_down(int rt, int l, int r) {
	if (tag[rt]) {
		int mid = (l + r) >> 1;
		Add(ls(rt), l, mid, tag[rt]);
		Add(rs(rt), mid + 1, r, tag[rt]);
		tag[rt] = 0;
	}
}
void Build(int rt, int l, int r) {
	tag[rt] = 0;
	if (l == r) {
		sum[rt] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	Build(ls(rt), l, mid);
	Build(rs(rt), mid + 1, r);
	Push_up(rt);
}
void Modify(int rt, int l, int r, int L, int R, int d) {
	if (L <= l && r <= R) {
		Add(rt, l, r, d);
		return;
	}
	Push_down(rt, l, r);
	int mid = (l + r) >> 1;
	if (L <= mid) {
		Modify(ls(rt), l, mid, L, R, d);
	}
	if (R > mid) {
		Modify(rs(rt), mid + 1, r, L, R, d);
	}
	Push_up(rt);
}
double Ask1(int rt, int l, int r, int L, int R) {
	if (L <= l && r <= R) {
		return sum[rt];
	}
	Push_down(rt, l, r);
	int mid = (l + r) >> 1;
	double res = 0;
	if (L <= mid) {
		res += Ask1(ls(rt), l, mid, L, R);
	}
	if (R > mid) {
		res += Ask1(rs(rt), mid + 1, r, L, R);
	}
	return res;
}
int Ask2(int rt,int l,int r,int pos) {
	if (l==r) {
		return sum[rt];
	}
	Push_down(rt, l, r);
	int mid = (l + r) >> 1;
	if (pos <= mid) {
		return Ask2(ls(rt), l, mid,pos);
	} else {
		return Ask2(rs(rt), mid + 1, r,pos);
	}
}
int main() {
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i = 1; i<=n; ++i) {
		scanf("%d",&a[i]);
	}
	Build(1,1,n);
	while(m--) {
		int op,x,y,k;
		scanf("%d%d%d",&op,&x,&y);
		if(op==1) {
			scanf("%d",&k);
			Modify(1,1,n,x,y,k);
		} else if(op==2) {
			printf("%.4f\n",Ask1(1,1,n,x,y)/(y-x+1));
		} else {
			int ans[maxn];
			int d = 1;
			for(int i = x; i<=y; ++i) {
				ans[d] = Ask2(1,1,n,i);
				d++;
			}
			int res = Ask1(1,1,n,x,y)/(y-x+1);
			double num = 0;
			for(int i = 1; i<=(y-1+1); ++i) {
				num += (res-ans[i])*(res-ans[i]);
			}
			printf("%.4f\n",num/(y-x+1));
		}
	}
	return 0;
}
2024/1/24 14:22
加载中...