悬赏关注(样例都不对)

P1471 方差

改了一下,样例过了,但还是0分 ```cpp #include <bits/stdc++.h> using namespace std; #define mid ((l + r) >> 1) const int N = 1e5 + 5; struct Node { double sum, sqsum, lazy; } c[N << 2]; int n, m; double a[N]; void build(int x, int l, int r) { if (l == r) { c[x].sum = a[l]; c[x].sqsum = a[l] * a[l]; return; } build(x << 1, l, mid); build(x << 1 | 1, mid + 1, r); c[x].sum = c[x << 1].sum + c[x << 1 | 1].sum; c[x].sqsum = c[x << 1].sqsum + c[x << 1 | 1].sqsum; } void pushdown(int x, int l, int r) { c[x << 1].lazy += c[x].lazy; c[x << 1].sqsum += c[x << 1].sum * c[x].lazy * 2 + c[x].lazy * c[x].lazy * (mid - l + 1); c[x << 1].sum += (mid - l + 1) * c[x].lazy; c[x << 1 | 1].lazy += c[x].lazy; c[x << 1 | 1].sqsum += c[x << 1 | 1].sum * c[x].lazy * 2 + c[x].lazy * c[x].lazy * (r - mid); c[x << 1 | 1].sum += (r - mid) * c[x].lazy; c[x].lazy = 0; } void updata(int x, int l, int r, int s, int t, double k) { if (s <= l && r <= t) { c[x].lazy += k; c[x].sqsum += c[x].sum * k * 2 + k * k * (r - l + 1); c[x].sum += (r - l + 1) * k; return; } if (c[x].lazy) pushdown(x, l, r); if (s <= mid) updata(x << 1, l, mid, s, t, k); if (t > mid) updata(x << 1 | 1, mid + 1, r, s, t, k); c[x].sum = c[x << 1].sum + c[x << 1 | 1].sum; c[x].sqsum = c[x << 1].sqsum + c[x << 1 | 1].sqsum; } double query1(int x, int l, int r, int s, int t) { if (s <= l && r <= t) return c[x].sum; if (c[x].lazy) pushdown(x, l, r); double ans = 0; if (s <= mid) ans += query1(x << 1, l, mid, s, t); if (t > mid) ans += query1(x << 1 | 1, mid + 1, r, s, t); return ans; } double query2(int x, int l, int r, int s, int t) { if (s <= l && r <= t) return c[x].sqsum; if (c[x].lazy) pushdown(x, l, r); double ans = 0; if (s <= mid) ans += query2(x << 1, l, mid, s, t); if (t > mid) ans += query2(x << 1 | 1, mid + 1, r, s, t); 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, x, y, k; cin >> op >> x >> y; if (op == 1) { cin >> k; updata(1, 1, n, x, y, k); } else if (op == 2) printf("%.4lf\n", query1(1, 1, n, x, y) / (y - x + 1.0)); else { double dv = query2(1, 1, n, x, y) / (y - x + 1.0); double f = query1(1, 1, n, x, y) / (y - x + 1.0); printf("%.4lf\n", dv - f * f); } } return 0; } ```
by gogei @ 2024-01-30 12:27:36


@[gogei](/user/558202) 输入的k是实数要用double
by jokiii @ 2024-01-30 12:42:56


谢谢大佬,已关注
by gogei @ 2024-01-30 13:30:27


|