mxqz 刚学线段树,有一点不理解
查看原帖
mxqz 刚学线段树,有一点不理解
176843
LiveZoom楼主2022/5/21 21:08

这份代码:

/*
I hope JLQ can bless me to AC the problem.
*/
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int kMaxN = 1e5 + 5;

struct Node {
  Node *ls, *rs;
  int l, r;
  ll sum, tag;
  
  Node () {}
  Node (int _l, int _r, ll _sum) : l(_l), r(_r), sum(_sum) {}
  ~Node() {}
} *rt ;

int n, m;
int a[kMaxN];
int op, x, y, k;

void pushup(Node* &cur) {
  ll res = 0;
  if (cur->ls != nullptr) res += cur->ls->sum;
  if (cur->rs != nullptr) res += cur->rs->sum;
  cur->sum = res; 
}

void addTag(Node* &cur, ll v) {
  cur->sum += 1ll * (cur->r - cur->l + 1) * v;
  cur->tag += v;
}

void pushdown(Node* &cur) {
  if (!cur->tag) return ;
  addTag(cur->ls, cur->tag), addTag(cur->rs, cur->tag);
  cur->tag = 0;
  return ;
}

void build(Node* &cur, int l, int r) {
  cur->l = l, cur->r = r;
  if (l == r) {
    cur->sum = a[l];
    return ;
  }
  int mid = (l + r >> 1);
  if (cur->ls == nullptr) cur->ls = new Node;
  if (cur->rs == nullptr) cur->rs = new Node;
  build(cur->ls, l, mid), build(cur->rs, mid + 1, r);
  pushup(cur);
}

void update(Node* &cur, int ql, int qr, ll v) {
  if (cur == nullptr) return ;
  if (cur->l > qr || cur->r < ql) return ;
  if (cur->l >= ql && cur->r <= qr) return addTag(cur, v), void();
//  puts("no");
  pushdown(cur);
  update(cur->ls, ql, qr, v), update(cur->rs, ql, qr, v);
  pushup(cur);
}

ll query(Node* cur, int ql, int qr) {
//  puts("no");
  if (cur == nullptr) return 0;
//  puts("fuck");
  if (cur->l > qr || cur->r < ql) return 0;
  if (cur->l >= ql && cur->r <= qr) return cur->sum;
  pushdown(cur);
  return query(cur->ls, ql, qr) + query(cur->rs, ql, qr);
}

int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
  }
//  puts("never");
  rt = new Node;
  build(rt, 1, n);
//  puts("bitch");
  for (int i = 1; i <= m; ++i) {
//    puts("gonna");
    scanf("%d%d%d", &op, &x, &y);
//    puts("shit");
    if (op == 1) {
      scanf("%d", &k);
      update(rt, x, y, k);
    }
    else {
//      puts("!!!");
      printf("%lld\n", query(rt, x, y));
    }
  }
  return 0;
}

本地输入到 2 2 4 就会 RE,交上去能过,而且空间很正常,求助大佬!

2022/5/21 21:08
加载中...