萌新刚学OI,线段树3WA、7RE
  • 板块P1471 方差
  • 楼主Reobrok_Kk
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/10/10 21:23
  • 上次更新2023/11/4 04:06:53
查看原帖
萌新刚学OI,线段树3WA、7RE
262147
Reobrok_Kk楼主2021/10/10 21:23
#include <bits/stdc++.h>
#define ls k << 1
#define rs k << 1 | 1
#define reg register
using namespace std;
template <typename T> inline T read() {
    T x = 0; bool flag = 1; char c = getchar();
    while (!isdigit(c)) {if (c == '-') flag = 0; c = getchar(); }
    x = c - '0'; c = getchar();
    while (isdigit(c)) {x = (x << 3) + (x << 1) + c - '0'; c = getchar(); }
    if (flag) return x;
    return ~(x - 1);
}
const int N = 1e5 + 5;
struct Tree {
    double sum, mul, lazy;
}T[N << 2];
double a[N];
void pushup(int k) {
    T[k].sum = T[ls].sum + T[rs].sum;
    T[k].mul = T[ls].mul + T[rs].mul;
}
void Build(int k, int l, int r) {
    if (l == r) {
        T[k].sum = a[l];
        T[k].mul = a[l] * a[l];
        return ;
    }
    int mid = (l + r) >> 1;
    Build(ls, l, mid);
    Build(rs, mid + 1, r);
    pushup(k);
    return ;
}
void pushdown(int k, int l, int r, int mid) {
    T[ls].lazy += T[k].lazy;
    T[rs].lazy += T[k].lazy;
    T[ls].mul += T[ls].sum * T[k].lazy * 2 + T[k].lazy * T[k].lazy * (mid - l + 1);
    T[rs].mul += T[rs].sum * T[k].lazy * 2 + T[k].lazy * T[k].lazy * (r - mid);
    T[ls].sum += T[k].lazy * (mid - l + 1);
    T[rs].sum += T[k].lazy * (r - mid);
    T[k].lazy = 0;
}
void Update(int k, int l, int r, int L, int R, double x) {
    if (l >= L && r <= R) {
        T[k].mul += T[k].sum * (x * 2) + (x * x) * (r - l + 1);
        T[k].sum += (r - l + 1) * x;
        T[k].lazy += x;
        return ;
    }
    int mid = (l + r) >> 1;
    if (T[k].lazy)
        pushdown(k, l, r, mid);
    if (L <= mid) Update(ls, l, mid, L, R, x);
    if (R > mid) Update(rs, mid + 1, r, L ,R, x);
    pushup(k);
    return ;
}
double Query(int k, int l, int r, int L, int R) {
    if (l >= L && r <= R)
        return T[k].sum;
    int mid = (l + r) >> 1;
    double ans = 0;
    if (T[k].lazy)
        pushdown(k, l, r, mid);
    if (L <= mid) ans += Query(ls, l, mid, L, R);
    if (R > mid) ans += Query(rs, mid + 1, r, L, R);
    return ans;
}
double Ask(int k, int l, int r, int L, int R) {
    if (l >= L && r <= R)
        return T[k].mul;
    int mid = (l + r) >> 1;
    double ans = 0;
    if (T[k].lazy)
        pushdown(k, l, r, mid);
    if (L <= mid) ans += Ask(ls, l, mid, L, R);
    if (R > mid) ans += Ask(rs, mid + 1, r, L, R);
    return ans;
}
signed main() {
    int n, q;
    n = read<int>(), q = read<int>();
    for (reg int i = 1; i <= n; ++i)
        a[i] = read<int>();
    Build(1, 1, n);
    for (reg int i = 1; i <= q; ++i) {
        int op, l, r, k, sum;
        op = read<int>(), l = read<int>(), r = read<int>();
        switch(op) {
        case 1:
            k = read<int>();
            Update(1, 1, n, l, r, k);
            break;
        case 2:
            printf("%.4lf\n", Query(1, 1, n, l, r) / 1.0 / (r - l + 1));
            break;
        case 3:
            sum = Query(1, 1, n, l, r);
            printf("%.4lf\n", Ask(1, 1, n, l, r) / 1.0 / (r - l + 1) - (sum / 1.0 / (r - l + 1)) * (sum / 1.0 / (r - l + 1)));
            break;
        }
    }
    return 0;
}

评测记录

样例过了,测试点死活过不去

救救孩子吧,调了几天了

2021/10/10 21:23
加载中...