数据结构
WenDavidOI
这个作者很懒,什么都没留下…
展开
-
逆序对 - 树状数组求解 - 高级数据结构
树状数组是一种非常高级的数据结构,用于求解动态的区间和问题。静态的区间和可以用前缀和用O(n)的时间预处理,再以O(1)的时间单次求解。而树状数组,维护的就是动态的前缀和。也就是说,树状数组可以实现下面两个操作:1、修改一个数,将一个位置上的数加上一个值2、求一段数的和 这两个操作的时间复杂度都是O(log2n),而且代码写起来非常简洁,用到了一些二进制的相应思想,比如lowbit(低位技术,求一原创 2016-02-15 19:37:11 · 919 阅读 · 0 评论 -
泛刷水题记17.12.22
目前处于康复期,所以做多一点题目……感觉自己码力退步了QAQ连初二的时候都比不上了(现在连LCT都写不动了……颓颓颓)LOJ 2038 「SHOI2015」超能粒子炮・改 题意:求∑i=0k(ni)(mod2333)\sum\limits_{i=0}^k\binom{n}{i}\pmod{2333},其中n,k≤1018n,k\leq 10^18 分析:一般组合数取模的题目我们都可以马上想原创 2017-12-21 22:05:27 · 355 阅读 · 0 评论 -
替罪羊树
平衡树,是平衡的二叉排序树,精确地说,是有一定限度下的平衡。在信息学竞赛中平衡树是一个相当重点的数据结构,而绝大多数的平衡树都是需要旋转的。比如说AVL树和红黑树是两个要在节点上附带信息的带旋转平衡树,这两种平衡树效果不错,但是写起来有点麻烦(貌似AVL树有六种情况需要旋转,红黑树中的删除操作似乎有更多的旋转情况),而SBT(Size Balanced Tree,子树大小平衡树)虽然写起来挺简单的原创 2016-09-28 13:53:26 · 5048 阅读 · 4 评论 -
强连通分量
强连通分量仍然是信息学中的基础内容,在图论中和连通分量一样都是相当重要的东西。而强连通分量类型的题不知为什么出现频率很高,比如缩环什么的,考了好多次……原创 2016-08-13 14:38:50 · 1526 阅读 · 0 评论 -
后缀树与后缀数组
后缀树和后缀数组是字符串处理的两大神器,几乎可处理掉一切的字符串处理问题,但是在实际中,后缀数组比后缀树更好写、好调,同时时间上也不差(常数很小),所以后缀数组绝对是OI竞赛之必备神器。原创 2016-08-12 11:14:36 · 2057 阅读 · 0 评论 -
高级数据结构 - 线段树(2)
【回顾】 上一次我们讲了一些线段树的基础,地址是http://t.cn/RbQ9gVH,主要涉及的有对区间和单个点的修改、查询。这一篇则相对偏向效率与正确性的证明。【线段树的高度】 首先我们假设线段树有n个节点,那么我们断言这棵线段树的高度不会超过。考虑将n替换成2的整幂次方,使得,而k最小。这很容易实现,一个简单的while循环之类就可以轻易搞定了。然后,以这个2的整幂次方为节点数建一棵线段树,原创 2016-02-15 19:38:34 · 1169 阅读 · 0 评论 -
二叉堆
二叉堆是一种高级数据结构,用于动态维护一个序列中的最值以及对某一个数的插入、删除。 我们现在首先定义一下二叉堆,二叉堆首先是一棵完全二叉树,而且根据对这里的最值定义,每一个节点都比其孩子节点更加靠近最值。举个例子,比如说我们要求最大值,那么每一个节点都比起孩子节点要大。这样的话,整一个序列的最大值就是第一个元素,我们称为Heap[1]。当然,我们也可以定义专门的常数root,使得Heap[root原创 2016-02-15 19:38:21 · 1320 阅读 · 1 评论 -
二叉排序树
二叉排序树是信息学竞赛中一个相当简单又相当复杂的东西,其实考到的次数不多,但是还是挺常用的。【定义】 二叉排序树的定义是这样的:设当前节点为o,且节点的数据结构是这样的:struct Node{ Node* left; Node* right; int value; int cmp(int x){ if (value == x) return -1; return value }}; 则:o原创 2016-02-15 19:38:17 · 580 阅读 · 0 评论 -
高级数据结构 - 线段树(1)
线段树是一种高级数据结构,用于解决区间的动态求最值与求和问题。举个例子,线段树能够解决的问题是像这样的:给出一个序列A,序列A一开始有一个统一的初值S,现要求编写一个程序,能够维护这个序列已达成以下的操作:1、改变一段数,将从Begin到End的所有值全部修改成同一个数Bi;2、求一段数的和,从Begin到End。数据范围:序列的长度 这一道题如果用直接的模拟,代码不会很长,但是效率也是够低的。假原创 2016-02-15 19:37:06 · 851 阅读 · 0 评论 -
单调队列
单调队列,是一种滑动窗口的优化技巧,用于求滑动窗口的最值。单调队列,其实是一种维护区间性单调序列的数据结构,比如说给出一个区间,我要一直求当前的最小值,而且这个区间一直向右或向左滑动,并且给出5*10^6的数据规模,也就是说几乎就是要O(n)算法时,就可以直接用单调队列了。单调队列的时间复杂度是O(n),而且常数比较小,可谓是一个相当好的数据结构。 那么,单调队列的实现又是怎样的呢? 首先,单调队原创 2016-02-15 19:37:15 · 619 阅读 · 0 评论 -
[BZOJ2957]楼房重建
貌似已经很久没有写blog了的说……一直在用为知笔记都快忘记博客了emm 这次先拿这样一道水题来写一下吧,这个思想好像很常用,最近这几天已经遇到很多次了。题意一个长度为nnn的序列wiwiw_i表示楼房高度,初始都是000,有mmm个操作,每次单点修改一个位置的高度,可以变成正的也可以变成负的,问有多少个位置能够在每次修改后被看到(也就是说,其最高点与原点连线上没有其他楼...原创 2018-04-16 19:53:47 · 362 阅读 · 0 评论