锰锌镁子刚学线段树,全WA求助QWQ
  • 板块P1471 方差
  • 楼主isitover
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/17 15:55
  • 上次更新2023/10/27 14:57:19
查看原帖
锰锌镁子刚学线段树,全WA求助QWQ
558743
isitover楼主2022/8/17 15:55

RT

各位 dalao 帮调一下,谢谢了。


#include <bits/stdc++.h>
#define int long long
using namespace std;
const int _ = 1e5 + 7;

struct Node {
  double Ssum, sum;
  double lazy;
  Node () {lazy = Ssum = sum = 0.0;}
} tree[_ << 2];
double a[_];
int lson(int root) {return root << 1;}
int rson(int root) {return root << 1 | 1;}
Node Merge(Node Tx, Node Ty, int Lazy) {
  Node res;
  res.Ssum = Tx.Ssum + Ty.Ssum, res.sum = Tx.sum + Ty.sum;
  res.lazy = Lazy;
  return res;
}
void Push_down(int l, int r, int root) {
  if (tree[root].lazy) {
    int mid = l + r >> 1;
    tree[lson(root)].Ssum += (mid - l + 1) * tree[root].lazy * tree[root].lazy + tree[lson(root)].sum * tree[root].lazy * 2 * 1ll;
    tree[rson(root)].Ssum += (r - (mid + 1) + 1) * tree[root].lazy * tree[root].lazy + tree[rson(root)].sum * tree[root].lazy * 2 * 1ll;
    tree[lson(root)].sum += (mid - l + 1) * tree[root].lazy * 1ll, tree[rson(root)].sum += (r - (mid + 1) + 1) * tree[root].lazy * 1ll;
    tree[lson(root)].lazy += tree[root].lazy * 1ll, tree[rson(root)].lazy += tree[root].lazy * 1ll;
    tree[root].lazy = 0;
  }
}
void Build(int l, int r, int root) {
  if (l == r) {
    tree[root].Ssum = a[l] * a[l], tree[root].sum = a[l];
    return ;
  }
  int mid = l + r >> 1;
  Build(l, mid, lson(root));
  Build(mid + 1, r, rson(root));
  tree[root] = Merge(tree[lson(root)], tree[rson(root)], 0);
}
void Change(int l, int r, int root, int L, int R, int k) {
  if (r < L or R < l) return ;
  if (L <= l and r <= R) {
    tree[root].lazy += k;
    tree[root].Ssum += (r - l + 1) * k * k + tree[root].sum * k * 2 * 1ll;
    tree[root].sum += (r - l + 1) * k * 1ll;
    return ;
  }
  Push_down(l, r, root);
  int mid = l + r >> 1;
  Change(l, mid, lson(root), L, R, k);
  Change(mid + 1, r, rson(root), L , R, k);
  tree[root] = Merge(tree[lson(root)], tree[rson(root)], tree[root].lazy);
}
Node Query(int l, int r, int root, int L, int R) {
  if (l > R or L > r) return Node();
  if (L <= l and r <= R) return tree[root];
  Push_down(l, r, root);
  int mid = l + r >> 1;
  return Merge(Query(l, mid, lson(root), L, R), Query(mid + 1, r, rson(root), L, R), 0);
}
signed main() {
  int n, m;
  double k;
  cin >> n >> m;
  for (int i = 1; i <= n; ++ i) cin >> a[i];
  Build(1, n, 1);
  for (int i = 1, op, l, r; i <= m; ++ i) {
    cin >> op >> l >> r;
    if (op == 1) {
      cin >> k;
      Change(1, n, 1, l, r, k);
    } else if (op == 2){
      Node res = Query(1, n, 1, l, r);
      printf("%.4lf\n", res.sum / (r - l + 1) * 1ll * 1.0);
    } else if (op == 3) {
      Node res = Query(1, n, 1, l, r);
      printf("%.4lf\n", (double)(res.Ssum / (r - l + 1) * 1ll * 1.0 - res.sum / (r - l + 1) * res.sum / (r - l + 1) * 1ll));
    } 
  }
  return 0;
}

2022/8/17 15:55
加载中...