线段树基本操作

简介: 笔记

query()


int query(int u, int l, int r) { //查询操作
  if (tr[u].l >= l && tr[u].r <= r)return tr[u].v; //树中节点已经被完全包含在[l,r]中
  int mid = tr[u].l + tr[u].r >> 1;
  int v = 0;
  if(l > mid)return query(u << 1 | 1,l,r);
    else if(r <= mid)return query(u << 1,l,r);
    else{
        int a = query(u << 1,l,r);
        int b = query(u << 1 | 1, l, r);
        return max(a,b);
    }
  return v;
}


build()


void build(int u, int l, int r) { //建树
  tr[u].l = l, tr[u].r = r; 
  if (l == r)return;
  int mid = l + r >> 1;
  build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
}


modify()


void modify(int u, int x, int v) { //u表示当前线段树区间 x表示待修改的位置 v表示修改的值
  if (tr[u].l == x && tr[u].r == x)tr[u].v = v;
  else {
    int mid = tr[u].l + tr[u].r >> 1;
    if (x <= mid)modify(u << 1, x, v);
    else modify(u << 1 | 1, x, v);
    pushup(u);
  }
}


pushup()


void pushup(Node& u, Node& l, Node& r) {
  u.sum = l.sum + r.sum;
  u.d = gcd(l.d, r.d);
}
void pushup(int u) {
  pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}


pushdown()


void pushdown(int u) {
  node& root = tr[u];
  node& left = tr[u << 1];
  node& right = tr[u << 1 | 1];
  if (root.add) {
    left.sum += (LL)(left.r - left.l + 1) * root.add;
    right.sum += (LL)(right.r - right.l + 1) * root.add;
    left.add += root.add;
    right.add += root.add;
    root.add = 0;
  }
}
目录
相关文章
|
5月前
|
存储 人工智能 索引
【数据结构】树状数组和线段树
【数据结构】树状数组和线段树
59 0
|
3月前
【数据结构OJ题】合并两个有序数组
力扣题目——合并两个有序数组
34 0
【数据结构OJ题】合并两个有序数组
|
5月前
|
存储 算法
数据结构实验(四)二叉树的基本操作
数据结构实验(四)二叉树的基本操作
|
存储
数据结构实验八 数组和广义表的基本操作及应用
数据结构实验八 数组和广义表的基本操作及应用
88 0
|
存储
数据结构实验六 栈和队列的基本操作及应用
数据结构实验六 栈和队列的基本操作及应用
122 0
|
5月前
栈和队列修炼指南(基本操作+OJ练习)
栈和队列修炼指南(基本操作+OJ练习)
|
存储 算法
数据结构实验四 线性表的基本操作及应用
数据结构实验四 线性表的基本操作及应用
77 0
《Java数据结构》二叉树的这些基本操作你真的理解了吗
《Java数据结构》二叉树的这些基本操作你真的理解了吗
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
|
算法 前端开发
理解和默写 二叉树的基本操作
理解和默写 二叉树的基本操作
94 0