线段树全部MLE,求解答

P1471 方差

@[Annie07](/user/556457) 开那么大,那么多的数组,不MLE才怪
by shengyeqi @ 2023-08-09 15:13:32


我改成了三个数组,也会超内存,怎么办 ```cpp #include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n, m; double sum[N * 4], sqr[N * 4]; void build (int k, int l, int r) { if (l == r) { scanf("%lf", &sum[k]); sqr[k] = sum[k] * sum[k]; return; } int mid = (l + r) >> 1; build(k * 2, l, mid); build(k * 2 + 1, mid + 1, r); sum[k] = sum[k * 2] + sum[k * 2 + 1]; sqr[k] = sqr[k * 2] + sqr[k * 2 + 1]; } double tag[N * 4]; void pushdown(int k, int l, int r); double ask1(int k, int l, int r, int x, int y) { if (r < x || y < l) return 0; if (x <= l && r <= y) return sum[k]; pushdown(k, l, r); int mid = (l + r) >> 1; return ask1(k * 2, l, mid, x, y) + ask1(k * 2 + 1, mid + 1, r, x, y); } double ask2(int k, int l, int r, int x, int y) { if (r < x || y < l) return 0; if (x <= l && r <= y) { return sqr[k]; } pushdown(k, l, r); int mid = (l + r) >> 1; return ask2(k * 2, l, mid, x, y) + ask2(k * 2 + 1, mid + 1, r, x, y); } void pushdown(int k, int l, int r) { int mid = (l + r) >> 1; if (tag[k]) { sqr[k * 2] += 2 * tag[k] * ask1(1, 1, n, l, mid) + tag[k] * tag[k] * (mid - l + 1); sqr[k * 2 + 1] += 2 * tag[k] * ask1(1, 1, n, mid + 1, r) + tag[k] * tag[k] * (r - mid); sum[k * 2] += tag[k] * (mid - l + 1); sum[k * 2 + 1] += tag[k] * (r - mid); tag[k * 2] += tag[k], tag[k * 2 + 1] += tag[k]; tag[k] = 0; } } void update(int k, int l, int r, int x, int y, double v) { if (r < x || y < l) return; if (x <= l && r <= y) { sqr[k] += 2 * v * ask1(1, 1, n, l, r) + v * v * (r - l + 1); sum[k] += v * (r - l + 1); tag[k] += v; return; } pushdown(k, l, r); int mid = (l + r) >> 1; update(k * 2, l, mid, x, y, v); update(k * 2 + 1, mid + 1, r, x, y, v); sqr[k] = sqr[k * 2] + sqr[k * 2 + 1]; sum[k] = sum[k * 2] + sum[k * 2 + 1]; } int main() { scanf("%d%d", &n, &m); build(1, 1, n); int op, x, y; double k, s, tmp; for (int i = 1; i <= m; i++) { scanf("%d", &op); if (op == 1) { scanf("%d%d%lf", &x, &y, &k); update(1, 1, n, x, y, k); } else if (op == 2) { scanf("%d%d", &x, &y); printf("%.4lf\n", ask1(1, 1, n, x, y) / (y - x + 1)); } else if (op == 3) { scanf("%d%d", &x, &y); s = ask1(1, 1, n, x, y); tmp = ask2(1, 1, n, x, y) - s * (s / (y - x + 1)); printf("%.4f\n", tmp / (y - x + 1)); } } return 0; } ```
by Annie07 @ 2023-08-09 15:31:25


|