社区讨论

样例没过,求调试(码风整洁)

P1471方差参与者 2已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@lo1vjbca
此快照首次捕获于
2023/10/23 03:40
2 年前
此快照最后确认于
2023/11/03 04:10
2 年前
查看原帖
样例输出前两行都是对的,第三行还是2.0000
我怀疑是我的修改函数写错了,但是看了半天愣是没看出来
CPP
#include <bits/stdc++.h>
#define db double
using namespace std;

struct tree
{
	int l;
	int r;
	db sum;
	db sum2;
	db add;
};

tree t[1919810];
double a[1919810];

double pf(double i)
{
	return i * i;
}

void pushup(int p)
{
	t[p].sum = t[p * 2].sum + t[p * 2 + 1].sum;
	t[p].sum2 = t[p * 2].sum2 + t[p * 2 + 1].sum2;
	return;
}

void build(int p, int l, int r)
{
	t[p].l = l;
	t[p].r = r;
	if(l == r)
	{
		t[p].sum = a[l];
		t[p].sum2 = pf(a[l]);
		return;
	}
	int mid = (l + r) / 2;
	build(p * 2, l, mid);
	build(p * 2 + 1, mid + 1, r);
	pushup(p);
	return;
}

void add(int p, int k)
{
	int l = t[p].l;
	int r = t[p].r;
	t[p].add += k;
	t[p].sum2 += (r - l + 1) * pf(k) + 2 * k * t[p].sum;
	t[p].sum += (r - l + 1) * k;
}

void spread(int p)
{
	if(t[p].add == 0)
		return;
	
	add(p * 2, t[p].add);
	add(p * 2 + 1, t[p].add);
	
	t[p].add = 0;
	return;
}

void change(int p, int l, int r, int z)
{
	if(l <= t[p].l && t[p].r <= r)
	{
		add(p, z);
		return;
	}
	spread(p);
	int mid = (t[p].l + t[p].r) / 2;
	
	if(l <= mid)
		change(p * 2, l, r, z); 
	
	if(r > mid)
		change(p * 2 + 1, l, r, z); 
	
	return;
}

double ask1(int p, int l, int r)
{
	if(l <= t[p].l && t[p].r <= r)
		return t[p].sum;
	
	spread(p);
	
	int mid = (t[p].l + t[p].r) / 2;
	double ans = 0;
	if(l <= mid)
		ans += ask1(p * 2, l, r);
	if(r > mid)
		ans += ask1(p * 2 + 1, l, r);
	return ans;
}

double ask2(int p, int l, int r)
{
	if(l <= t[p].l && t[p].r <= r)
		return t[p].sum2;
	
	spread(p);
	
	int mid = (t[p].l + t[p].r) / 2;
	double ans = 0;
	if(l <= mid)
		ans += ask2(p * 2, l, r);
	if(r > mid)
		ans += ask2(p * 2 + 1, l, r);
	return ans;
}

signed main()
{
	freopen("a.txt", "r", stdin);
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; i = i + 1)
		cin >> a[i];
	build(1, 1, n);
	for(int i = 1; i <= m; i = i + 1)
	{
		int op, x, y, k;
		cin >> op >> x >> y;
		if(op == 1)
		{
			cin >> k;
			change(1, x, y, k);
		}
		if(op == 2)
			cout << fixed << setprecision(4) << ask1(1, x, y) / double(y - x + 1) << "\n";
		if(op == 3)
		{
			double av = ask1(1, x, y) / double(y - x + 1);
			cout << fixed << setprecision(4) << ask2(1, x, y) / double(y - x + 1) - av * av  << "\n";
		}
	}
	return 0;
}

回复

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

正在加载回复...