社区讨论
样例没过,求调试(码风整洁)
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 条回复,欢迎继续交流。
正在加载回复...