随笔分类 -  数据结构

摘要:LCA:最近公共祖先问题 解决方法: 1. 采用链式前行星存图,可以优化空间占用和遍历速度 2. Tarjan离线可以一次性处理所有的请求,时间复杂度为O(n+q) 下面简单介绍下Tarjan离线求LCA: 首先dfs遍历树,当某个结点左右子树都遍历完成后,处理所有与它有关的请求,然后将其利用并查集 阅读全文
posted @ 2021-02-01 08:50 Daybreaking 阅读(103) 评论(0) 推荐(0)
摘要:题目链接 题意 将一棵二叉搜索树的结点按照从小到大的顺序构建成一个双向链表,要求不能创建新的节点。 思路 首先很容易想到对二叉树的中序遍历可以得到升序的结点序列。 其次,维护一个头结点head,和一个始终指向当前最后一个结点的prev。 因此每在第一步得到一个节点,就把它插入到prev的后面,并更新 阅读全文
posted @ 2021-01-31 17:46 Daybreaking 阅读(79) 评论(0) 推荐(0)
摘要:区间修改,单点查询的问题(非线段树) + 因为线段树忘了具体的操作方式,所以不知道这个题线段树为啥不行,该补补线段树了 + 因为区间太大了,所以不能暴力直接对数组进行标记。 解决方案 采用设置两个容器(分别记为head,tail)的方法,分别存储一段区间的开头、结尾 + 假设head中有一个数i,则 阅读全文
posted @ 2020-04-26 22:33 Daybreaking 阅读(132) 评论(0) 推荐(0)
摘要:1 //poj1195 二维线段树之树套树 2 // 先确定横坐标所在的区间并记录该结点的编号p,然后再确定纵坐标所在的区间并记录该结点的编号cur,则tree[cur][p]为目标区间。 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cs 阅读全文
posted @ 2020-04-26 13:08 Daybreaking 阅读(308) 评论(0) 推荐(0)
摘要:1 //zoj 2859 2 // 二维线段树之矩形树 求解矩阵和问题 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cmath> 7 #include <algorithm> 8 #include 阅读全文
posted @ 2020-04-26 13:06 Daybreaking 阅读(263) 评论(0) 推荐(0)
摘要:1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 //#define INPUT 6 /** 7 Problem:1182 - 食物链,NOI2001 8 Begin Time: 阅读全文
posted @ 2020-04-26 13:05 Daybreaking 阅读(389) 评论(0) 推荐(0)
摘要:牛客 Forsaken的三维数点 题目描述 Forsaken现在在一个三维空间中,空间中每个点都可以用(x,y,z)(x,y,z)表示。突然,三维空间的主人出现了,如果Forsaken想要继续在三维空间中呆下去,他就必须回答三维空间主人的问题。 主人会在空间中坐标为(x,y,z)(x,y,z)处加一 阅读全文
posted @ 2019-10-27 21:09 Daybreaking 阅读(311) 评论(0) 推荐(0)
摘要:落谷3384 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #include<stack> 8 #inclu 阅读全文
posted @ 2019-10-25 08:16 Daybreaking 阅读(183) 评论(0) 推荐(0)
摘要:1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #inclu 阅读全文
posted @ 2019-10-24 15:58 Daybreaking 阅读(136) 评论(0) 推荐(0)
摘要:#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <stack> #include <deque> #incl 阅读全文
posted @ 2019-10-20 16:13 Daybreaking 阅读(176) 评论(0) 推荐(0)
摘要:HDU 1251 AC代码 #include<cstdio> #include<cstdlib> #include<cstring> #include<string.h> #include<cmath> #include<algorithm> #include<queue> #include<sta 阅读全文
posted @ 2019-10-19 15:48 Daybreaking 阅读(167) 评论(0) 推荐(0)
摘要:我感觉划分树的基本思想是二分和归并排序,分为建树和查询两个部分。 1、建树 递归建树,以中值为界,将序列划分成左右两部分,直到分到每个点为止。同时,在建树的过程中,记录下每一层进入左区间的数的个数,方便查询时使用。 注意:保持左右区间中数的相对顺序。 (1)、中值唯一的情况。将小于等于中值的数放到左 阅读全文
posted @ 2018-08-09 18:49 Daybreaking 阅读(303) 评论(0) 推荐(0)
摘要:线段树几个基本操作 单点查询 单点修改 区间查询 区间修改 区间求最大值 主要思想: 将一个线性的一维数组构建成树形的数组,使得可以用二分的思想来进行区间操作,降低时间复杂度,但是多占用了空间,典型的用空间换时间。 一个特殊的模块: lazy数组,考虑到对区间的操作有很多次,并且没有必要每一次对区间 阅读全文
posted @ 2018-08-05 21:52 Daybreaking 阅读(171) 评论(0) 推荐(0)
摘要:看了很长时间大佬的博客,终于明白了区间修改和单点查询的原理,因为大佬们的思维比较强大,所以菜鸡决定写一篇较为详细的解释。 首先引入差分数组d,设原数组为a,令d[i]=a[i]-a[i-1].由此关系式得,也就是a[j]等于d[j]的前 j 项和,即前缀和。 于此,我们的树状数组维护的是 d 的前缀 阅读全文
posted @ 2018-08-02 17:07 Daybreaking 阅读(4893) 评论(0) 推荐(1)