首页 > 其他分享 >线段树与树状数组

线段树与树状数组

时间:2024-11-07 21:10:16浏览次数:1  
标签:下标 树状 int 线段 数组 区间

线段树与树状数组都是十分经典的数据结构,其实能用树状数组解决的问题也都能用线段树解决,但线段树相比于树状数组常数较大。
单点修改区间查询
线段树做法树状数组做法,其实单纯实现这个还是用树状数组较好(毕竟常数小还好写)
区间修改区间查询

  1. 只有区间加 树状数组做法线段树做法
  2. 既有区间加又有区间乘,应该只能用线段树做法了,注意要乘法优先(每次更改时先乘再加)。

权值线段树/树状数组
其实就是正常线段树/树状数组维护的定义域下标为正常下标,现在为权值。


线段树专讲
线段树其实就是通过几个小区间的信息,合并出一个大区间的信息,所以线段树的运算要满足结合律。对不同题目,我们要考虑记录不同的信息,要合并它们。

  1. 动态开点线段树
    就是定义域下标范围太大,不能把整棵树开满,那就用一个点,看一个点
    code:
点击查看代码
struct Segment_Tree {
  int ncnt=0;
  struct Node { int son[2];} f[10000010];
  int newnode_() { return ncnt++;}
  int modify_(int x,int l,int r,int pos,int md) {
      if (!x) x=newnode_();
      if (l==r) { return 0;}

      int mid=(l+r)>>1;
      if (pos<=mid) f[x].son[0]=modify_(f[x].son[0],l,mid,pos,md);
      else f[x].son[1]=modify_(f[x].son[1],mid+1,r,pos,md);
      pushup_(x);
      return x;
  }
} st;
  1. 线段树二分,线段树上二分,听起来挺高深,其实就是像二分一样每次判断查询区间往右挪还是往左挪,然后想应该去的方向递归。
  2. 线段树维护区间最大子段和
    线段树每个点维护四个信息,区间最大子段和,最大前缀,最大后缀,区间和。用这几个条件合并(
  3. 结合树
    对一棵子树修改/查询,由于字数内dfs序是连续的,用线段树维护。(
  4. 区间修时取模操作
    由于每次取模至少减半,所以一个数最多被修改\(log\)次,区间修时可以递到每个l==r更改,复杂度\(log^{2}\)(
  5. 当我们每次对区间增加一个等差数列,求单点,可以线段树维护差分数组。(

标签:下标,树状,int,线段,数组,区间
From: https://www.cnblogs.com/OIergyy/p/18533990

相关文章

  • 力扣中等难度热题——长度为K的子数组的能量值
    目录题目链接:3255.长度为K的子数组的能量值II-力扣(LeetCode)题目描述示例提示:解法一:通过连续上升的长度判断Java写法:C++写法: 相比与Java写法的差别运行时间时间复杂度和空间复杂度时间复杂度:空间复杂度:解法二:双指针+极限优化优化前Java写法:优化前运行时......
  • 【线段树合并】雨天的尾巴
    题意给一棵\(n\)个节点的无根树,共\(m\)次操作,每次操作是一个三元组\((x,y,z)\),表示路径\((x\toy)\)全部发一袋类型为\(z\)的救济粮。问最后每座房子存放最多的是哪种救济粮。思路看到树上路径的操作,首先考虑差分,但本题的特殊之处在于每个节点有\(10^5\)种不同的......
  • 后缀数组
    学了这个东西字符串水平下降一万倍,之前敢拿hash草的题现在不敢了。后缀数组板题后缀数组可以把字符串的所有后缀存起来,然后干各种奇怪的事情。现在给你一个字符串banana,给他的后缀A,NA,ANA,NANA,ANANA,BANANA跑一个后缀的trie。然后把字典序小的字母排在左边,给每个后缀对......
  • pyspark 解析kafka数组结构数据
    frompyspark.sql.functionsimportget_json_object,col,from_unixtime,instr,length,regexp_replace,explode,from_jsonfrompyspark.sql.typesimport*#定义数组结构schema=ArrayType(StructType([StructField("home",StringType()),S......
  • js中类数组
    在JavaScript中,类数组(Array-likeObject)是指那些拥有类似数组的结构和特征,但并不真正是数组的对象。类数组对象有以下几个特征:具有length属性:类数组对象通常都有一个length属性,表示其元素的个数。可以通过整数索引访问元素:类数组对象的元素可以通过数字索引访问,类似于数......
  • 二维树状数组
    前置知识树状数组(不会就学一下再来)简介因为树状数组可以非常简洁解决序列上的一些问题,所以考虑能否用树状数组解决矩阵(二维序列)的问题。比较暴力的想法是对于每一横行建一个树状数组,再对每一列建一个树状数组统计答案。但这样显然要\(n+m\)个树状数组,但是我们发现这些树状数......
  • CUDA开始的GPU编程 - 第四章:C++封装GPU上的数组
    第四章:C++封装GPU上的数组std::vector的秘密:第二模板参数**你知道吗?**std::vector作为模板类,其实有两个模板参数:std::vector<T,AllocatorT>那为什么我们平时只用了std::vector呢?因为第二个参数默认是std::allocator。也就是std::vector等价于std::vector<T,s......
  • 华为OD机试真题-数组二叉树码-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述二叉树也可以用数组来......
  • LeetCode3264[K次乘运算后的最终数组I]
    题目链接LeetCode3264[K次乘运算后的最终数组I]详情实例实例1实例2提示题解思路先找到最小值然后对最小值进行操作最后输出容器代码classSolution{public:intfindVecMinNumIndex(vector<int>nums)//找出最小值的下标{inti=0,iMin......
  • lanqiaoOJ 1110:小王子单链表 ← 数组模拟实现
     【题目来源】https://www.lanqiao.cn/problems/1110/learning/【题目描述】小王子有一天迷上了排队的游戏,桌子上有标号为1-10的10个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把哪个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排......