首页 > 其他分享 >数据结构

数据结构

时间:2023-08-04 19:33:40浏览次数:20  
标签:return int mid 查询 区间 query 数据结构

线段树

线段树可以在 O( logN ) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。

注意点:

  • 线段树的数组一般要开到4 * N;  位运算的写法为 N >> 2
  • 对于懒标记:修改的时候不用用到下面的区间,查询的时候才会用到下面的区间
    • 故每次插入懒标记不用递归到叶子节点

建树

void build(int u, int l, int r) {
    if (l == r) {  // 递归边界
        f[u] = a[l];
        return;
    }
    int mid = l + r >> 1;
    build(u << 1, l, mid);  // 建左儿子
    build(u << 1 | 1, mid + 1, r);
    f[u] = f[u << 1] +
           f[u << 1 | 1];  // 父节点区间和 = 左儿子区间和 + 右儿子区间和
}

单点修改

// 当前修改 u 节点, u 节点所对应区间为[l, r] 要给 a[p] 加上 c
void add(int u, int l, int r, int p, int c) {
    f[u] += c;
    if (l == r)
        return;
    int mid = l + r >> 1;
    if (p <= mid)  // p 在左儿子区间
        add(u << 1, l, mid, p, c);
    else
        add(u << 1 | 1, mid + 1, r, p, c);
}

区间查询

// 当前为 u 节点, u 节点所对应区间为[l, r] 要查询[s, t]区间和
ll query(int u, int l, int r, int s, int t) {
    if (l == s && r == t)
        return f[u];
    int mid = l + r >> 1;
    if (t <= mid)  // 查询区间完全在左侧
        return query(u << 1, l, mid, s, t);
    else if (s > mid)  // 查询区间完全在右侧
        return query(u << 1 | 1, mid + 1, r, s, t);
    else  // 左侧部分 + 右侧部分     *注意修改查询区间的边界
        return query(u << 1, l, mid, s, mid) +
               query(u << 1 | 1, mid + 1, r, mid + 1, t);
}

 

标签:return,int,mid,查询,区间,query,数据结构
From: https://www.cnblogs.com/W-qwq/p/17606256.html

相关文章

  • GO 数据结构操作:栈
        ......
  • 【数据结构 | 入门】线性表与链表 (问题引入&实现&算法优化)
    ......
  • 考研数据结构——每日一题[二叉搜索树与表达式树]
    3765.表达式树请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。例如,当下列两棵表达式树作为算法的输入时:输出的等价中缀表达式分别为(a+b)(c(-d))和(a*b)+(-(c-d))。注意:树中至少包含一个运算符。当运算符是负号时......
  • 数据结构杂烩
    线段树P4681[THUSC2015]平方运算简要题意给定一个序列,区间.map([](intx){x=x*x%p;});,区间求和。p给定,为小质数。\(N,M\le105\)。题解而把一个数看作一个点,向其平方取模连一条边,则最终必然构成一个基环森林,注意到\(P\)很小,每个数经过至多\(11\)次迭代之后......
  • 接口相似数据结构复用率高?Apipost这招搞定!
    在API设计和开发过程中,存在许多瓶颈,其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作:在每个API中都编写相同的数据,这不仅浪费时间和精力,还容易出错并降低API的可维护性。为了解决这个问题,Apipost推出了数据模型板块。用户可以预先创建多个数据模型,并在API设计过......
  • 接口相似数据结构复用率高?Apipost这招搞定!
    在API设计和开发过程中,存在许多瓶颈,其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作:在每个API中都编写相同的数据,这不仅浪费时间和精力,还容易出错并降低API的可维护性。为了解决这个问题,Apipost推出了数据模型板块。用户可以预先创建多个数据模型,并在API设计......
  • C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m
    动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表......
  • 数据结构与算法
    链表链表跟数组关系密切,首先你要理解数组是一块连续的内存地址,把数据放进去。但是他有个不好就是不适合去做增删改查,进行移除或增加操作时,往往非常繁琐,相当于要改变整个数组,因此呢!链表就应用而生,给在存放每一个数据,同时给这个数据指向它后一个数据(链表分为指针域和数据域),且不在是储......
  • C语言数据结构学习资源
    我的代码仓库:efjN/DataStructure-码云-开源中国(gitee.com)学习方法:notion刷题模版:我的刷题记录https://beneficial-lyric-0ae.notion.site/leetcode-6b567423e5124303805770068f21692c?pvs=4学习网站:Hello算法(hello-algo.com)5星推荐代码随想录(programmercar......
  • 【C++数据结构】启航,打开新世界的大门!
    @TOC一、学习数据结构的原因学习数据结构对于计算机科学和软件开发非常重要,它提供了处理和组织数据的有效方法和技术。以下是几个学习数据结构的重要原因:提高问题解决能力:数据结构教会了我们如何选择和使用适当的数据结构来解决问题。了解各种数据结构的特性和性能可以帮助我们分......