qbxt Day 2 afternoon

——2020.1.18 济南 主讲:李佳实

目录一览

1.线段树
2.二叉搜索树(略过)
3.树状数组

总知识点:基础数据结构(本人初学感觉好难)

一、线段树

1.描述:线段树是一种分治的思想,用树形结构把一个大区间划分成小区间,它同时又是一棵二叉树。
2.概念名词定义:
区间(又称线段):线段树上的每一个节点对应于一个区间[a,b]。(a,b为整数)
特殊说明:对于叶子节点,其对应的区间长度为1。

For Example:
(1)区间[1,10]对应的线段树

(2)区间[1,9]对应的线段树

3.性质:对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b](除法去尾取整)
4.基本操作:
(1)线段树的存储:类似于堆
对于一棵线段树,它的根节点下标为1。
其下标为i的节点,它的左儿子下标为2i,右儿子下标为2i+1。
(2)线段树核心操作:区间分解
定义:若线段树根节点对应区间为[a,b],给定区间c,d,找出一些节点,使这些节点对应的区间互相不重叠,且加起来正好是[c,d],这样的操作过程即区间分解。

代码核心思想:二分

操作步骤:(递归分解)
1.从根节点出发,开始区间分解
2.遇到节点[x,y]时,如果要分解的区间就是[x,y],即为找到一个终止节点,Break。
3.否则,(二分思想)定义mid,取mid=(x+y)/2。
4.看我们要分解的区间与[x,mid]和[mid+1,y]和哪个有交集,就进入区间进行进一步的递归分解。(有可能与左右两个区间都有交集,需要同时分解)
注:区间分解的时间复杂度和分解完以后的区间个数均为O(logn)。

For Example:区间[1,9]的线段树上,分解区间[2,8].

代码实现:

inline void spilt(int k,int l,int r,int z,int y){
        //k为当前节点的编号
    //l,r为线段树的总区间。z,y为要分解的目标区间[z,y]
    if(l==z&&r==y) return;  //找到了一个分解的区间
    int mid=(l+r)/2;
    if(y<=mid) spilt(k*2,l,mid,z,y);    //在左儿子的区间里,分解左儿子的区间
    else if(z>mid) spilt(k*2+1,mid+1,r,z,y);    //在右儿子的区间里,分解右儿子的区间
    else{   //两个区间都有交集
        spilt(k*2,l,mid,z,mid); //目标区间在左儿子里的部分
        spilt(k*2+1,mid+1,r,mid+1,y);   //目标区间在右儿子里的部分
    }
}
//例:(上图)spilt(1,1,9,2,8) 

二、二叉搜索树:本内容主要为了以后学习平衡树Tree,暂且略过。。。。。。(勿喷)

三、树状数组:(心碎的回忆)

1.定义:
For Example:
以56为例:56->111000
K=3
56-2^3+1=(110001)(二进制)=49
C[56]=a[49]+..+a[56]
a[1...56]=C[56]+C[48]+C[32]

2.结构

注:A是原数组、C是树状数组。

3.执行操作:单点修改、区间查询
4.(玄学操作)lowbit

2^k=lowbit(x)=x and (x xor(x-1))

For Example:
假设:
x = 0...1...0...10......0(第二个1后k个0)
x = 0...1...0...01......1(第三个0后k个1)

x xor(x-1)=0...0...0...11......1(第一个1后k+1个1)
5.查询操作
代码:

int query(int x)    //求a[1...x]的和
{
    int res=0;
    for(int i=x;i>0;i-=lowbit(i)) res+=C[i];
    return res;
}

6.修改操作
代码:
```c++
void add(int x,int delta) //将a[x]添加delta
{
for(int i=x;i<=n;i+=lowbit(i)) C[i]+=delta;
}

---------------------------------------------THE END---------------------------------------------------

清北学堂—2020.1提高储备营—Day 2 afternoon(线段树、树状数组)的更多相关文章

  1. 清北学堂—2020.1提高储备营—Day 4 afternoon(动态规划初步(一))

    qbxt Day 4 afternoon --2020.1.20 济南 主讲:顾霆枫 目录一览 1.动态规划初步 2.记忆化搜索 3.递推式动态规划 4.记忆话搜索与递推式动态规划的转化 5.状态转移 ...

  2. 清北学堂—2020.1提高储备营—Day 1 afternoon(二分、分治、贪心)

    qbxt Day 1 afternoon --2020.1.17 济南 主讲:李佳实 目录一览 1.二分法 2.分治 3.贪心 总知识点:基础算法 一.二分法 (1)算法分析:二分法是一种暴力枚举的优 ...

  3. 清北学堂—2020.1提高储备营—Day 4 morning(数论)

    qbxt Day 4 morning --2020.1.20 济南 主讲:李奥 目录一览 1.一些符号与基本知识 2.拓展欧几里得,逆元与欧拉定理 3.线性筛法与积性函数(非重点) 总知识点:数论 一 ...

  4. 清北学堂—2020.1提高储备营—Day 3(图论初步(二))

    qbxt Day 3 --2020.1.19 济南 主讲:李奥 目录一览 1.图论(kruskal算法,最短路径算法,拓扑排序) 总知识点:图论 一.kruskal算法 1.目的:求图的最小生成树 2 ...

  5. 清北学堂—2020.1提高储备营—Day 3(图论初步(一))

    qbxt Day 3 --2020.1.19 济南 主讲:李奥 目录一览 1.图论(图.图的存储方式.最小生成树的定义) 总知识点:图论 前言:众所周知,图论是一个非常重要的部分,而这次集训也可以算从 ...

  6. 清北学堂—2020.1提高储备营—Day 1 morning(模拟、枚举、搜索)

    qbxt Day 1 morning --2020.1.17 济南 主讲:李佳实 目录一览 1.模拟和枚举 2.基础搜索算法(DFS.BFS.记忆化搜索)以及进阶搜索算法(纯靠自学) 总知识点:基础算 ...

  7. 清北学堂—2020.1提高储备营—Day 2 morning(并查集、堆)

    qbxt Day 2 morning --2020.1.18 济南 主讲:李佳实 目录一览 1.并查集 2.堆 总知识点:基础数据结构 一.并查集 1.描述:并查集是一类十分常用的数据类型,它有着十分 ...

  8. 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记

    qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...

  9. 清北学堂 2020 国庆J2考前综合强化 Day7

    目录 1. 题目 T1 魔力石 题目描述 Sol T2 和 题目描述 Sol T3 数对 题目描述 Sol T4 海豹王国 题目描述 Sol 考场策略 1. 题目 T1 魔力石 题目描述 题目描述 小 ...

随机推荐

  1. [C语言学习笔记二] extern 函数的用法

    extern 用来定义一个或多个变量.其后跟数据类型名和初始值.例如: extern int a =10 它与 int,long long int,double,char的本质区别,在于 extern ...

  2. Shell重定向与exec

    前言 首先我们需要知道exec是什么,exec是linux下面一个创建进程的方法,详情请参考:https://www.cnblogs.com/guge-94/p/11016176.html 重定向 概 ...

  3. JSP&Servlet学习笔记----第5章

    Servlet进阶API 每个Servlet都必须由web容器读取Servlet设置信息(标注或者web.xml).初始化. 对于每个Servlet的设置信息,web容器会为其生成一个ServletC ...

  4. uml图六种箭头的含义

    转:https://blog.csdn.net/wglla/article/details/52225571 在看一些技术博客的时候,经常会见到博客里画上很多uml图.因为经常会被这几种表达关系的箭头 ...

  5. 使用Apache服务器实现Nginx反向代理

    实验环境:centos7 注:因为本次实验在同一台服务器上,Apache与Nginx同为80端口,所以改Apache端口为60 1 配置Nginx服务器: 编辑Nginx配置文件,写入以下内容 loc ...

  6. 构建ROP链实现远程栈溢出

    通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这 ...

  7. 申请Let’s Encrypt通配符HTTPS证书(certbot ACME v2版)

    1.获取certbot-auto# 下载 # 下载 wget https://dl.eff.org/certbot-auto # 设为可执行权限 chmod a+x certbot-auto 2.开始 ...

  8. 达梦数据库-RAC-DMDSC部署的关键点

    达梦数据库-RAC-DMDSC部署的关键点 环境准备 网络准备(ip地址分配).共享磁盘准备和挂载 ifconfig enp0s8 10.1.2.101;ifconfig enp0s9 192.168 ...

  9. docker-enter 安装

    github : https://github.com/sequenceiq/docker-enter [root@localhost ~]# docker run --rm -v /usr/loca ...

  10. logstash 配置文件语法

    需要一个配置文件 管理输入.过滤器和输出相关的配置.配置文件内容格式如下: # 输入 input { ... } # 过滤器 filter { ... } # 输出 output { ... } 先来 ...