线段树基本操作

简介: 笔记

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;
  }
}
目录
相关文章
|
9月前
|
存储
顺序表的基本操作(必学)
顺序表的基本操作
112 0
|
存储 算法
二叉树基本操作实现 && 树和二叉树&& 二叉树进阶oj && 堆的基本概念 && 优先级队列的使用_
二叉树基本操作实现 && 树和二叉树&& 二叉树进阶oj && 堆的基本概念 && 优先级队列的使用_
93 0
|
9月前
|
存储 算法
数据结构实验(四)二叉树的基本操作
数据结构实验(四)二叉树的基本操作
|
存储
数据结构实验六 栈和队列的基本操作及应用
数据结构实验六 栈和队列的基本操作及应用
186 0
|
存储
数据结构实验八 数组和广义表的基本操作及应用
数据结构实验八 数组和广义表的基本操作及应用
125 0
|
9月前
|
存储
单链表基本操作
单链表基本操作
56 0
|
9月前
|
存储 人工智能 算法
【408数据结构与算法】—单链表的基本操作(六)
【408数据结构与算法】—单链表的基本操作(六)
|
存储 算法
数据结构实验四 线性表的基本操作及应用
数据结构实验四 线性表的基本操作及应用
94 0
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
|
算法 前端开发
理解和默写 二叉树的基本操作
理解和默写 二叉树的基本操作
119 0