随笔分类 -  数据结构

摘要:有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。 阅读全文
posted @ 2018-09-20 15:52 静听风吟。 阅读(394) 评论(0) 推荐(0)
摘要:对于每个节点维护这个节点到根的权值线段树 对于每个询问(x,y),这条路径上的线段树 tree[x]+tree[y]-tree[lca(x,y)]-tree[fa[lca(x,y)]] 阅读全文
posted @ 2018-09-06 17:52 静听风吟。 阅读(370) 评论(0) 推荐(0)
摘要:把所谓的树结构分成一块儿一块儿的? 当然这种数据结构并不强力,如果想要借助其分块儿的思想来解决问题,肯定有更好的其它的算法来替代它 所以,这里只是铺一个知识点探探路而已 典型例题BZOJ1086 题意就是把树分块儿 但是为何样例是错的? 其实递归的学问还是很大的 阅读全文
posted @ 2018-08-24 20:56 静听风吟。 阅读(614) 评论(0) 推荐(0)
摘要:这个东西看起来很棒棒的样子呀 bitset存储二进制数位 bitset就像一个bool类型的数组一样 bitset中的每个元素都能单独被访问 整数类型和布尔数组都能转化成bitset 有关Bitset的定义,运算以及相关的函数详见dalao的博客 https://www.cnblogs.com/Ra 阅读全文
posted @ 2018-08-24 20:36 静听风吟。 阅读(614) 评论(0) 推荐(0)
摘要:K-D树实际上是一棵高维二叉搜索树,与普通二叉搜索树不同的是,树中存储的是一些K维数据 普通的二叉搜索树是一维的,当推广到K维后,就是我们的K-D树了 在K-D树中跟二叉搜索树差不多,也是将一个K维的数据与根节点进行比较,然后划分的 这里的比较不是整体的比较,而是选择其中一个维度来进行比较 在K-D 阅读全文
posted @ 2018-08-24 20:23 静听风吟。 阅读(1010) 评论(0) 推荐(0)
摘要:所谓的启发式合并就是合并的时候把小的东西往大的东西里面一个一个插 这里顺便说一下之前刷过去的线段树合并 对于一个结点,如果两颗线段树都有此位置的结点,则直接合并两结点的信息 然后递归处理左右子树 若只有一个有,直接返回即可 最坏的情况要合并n个结点,然后每个结点合并的时间复杂度是O(logn)的,那 阅读全文
posted @ 2018-08-24 19:45 静听风吟。 阅读(1685) 评论(0) 推荐(0)
摘要:可以说是线段树合并的裸题吧 题意就是给你两个操作 一个操作是合并两个集合,这两个集合都是用权值线段树维护的,便于查询第k小元素 另一个操作就是查询区间极值了 权值线段树的理解更加深刻了 权值线段树的下标是数字本身,而存的是这个数出现的次数,也就是权值 一般权值线段树都是和动态开点捆绑在一起的 所谓动 阅读全文
posted @ 2018-08-24 17:25 静听风吟。 阅读(307) 评论(0) 推荐(0)
摘要:紫书原题,UVA297 利用四叉树处理图片,给你两张黑白图片的四叉树,问两张图片叠加后黑色的面积 给出两颗四分树的先序遍历,求合并之后黑色像素的个数,p表示斑马结点,f表示黑色,e表示白色 四分树是一个神奇的树,只需要给出先序遍历就可以确定整棵树 四分树也可以用来实现二维线段树,只不过太恶心啦 有个 阅读全文
posted @ 2018-08-24 16:37 静听风吟。 阅读(2004) 评论(0) 推荐(0)
摘要:这里只支持查询不支持修改,总的时间复杂度为O((n+q)*√n) 阅读全文
posted @ 2018-08-24 15:50 静听风吟。 阅读(683) 评论(0) 推荐(0)
摘要:越来越高级了 区间重置非常好弄 此题的关键在于查询区间内一个数的个数 其实可以发现,在多次操作之后,整个序列就变成仅由几段不同数值所组成的序列了 我们可以维护每一个分块是否只有一种权值,在询问的时候,针对这种块可以O(1)统计答案 否则暴力统计然后修改标记,不完整的块暴力就可以了 阅读全文
posted @ 2018-08-23 20:13 静听风吟。 阅读(220) 评论(0) 推荐(0)
摘要:这里问题的关键是妥善处理好两种标记 让乘法标记的优先级高于加法 若当前的一个块乘以m1后加上a1,这时进行一个乘m2的操作,则原来的标记变成m1*m2,a1*m2 若当前的一个块乘以m1后加上a1,这时进行一个加a2的操作,则原来的标记变成m1,a1+a2 阅读全文
posted @ 2018-08-23 19:57 静听风吟。 阅读(503) 评论(0) 推荐(0)
摘要:典型的平衡树操作了 每一个块用动态数组维护,每次插入是找到对应的块 然后直接插,这个元素之后的数字都平移一位,如果用链表的话更好 如果块的大小不平衡了,要进行重新分块的 操作 每根号n次插入后,重新把数列平均分一下块 重构需要的复杂度为O(n),重构的次数为√n 也可以改变重构的方式,在某个块过大时 阅读全文
posted @ 2018-08-23 19:38 静听风吟。 阅读(438) 评论(0) 推荐(0)
摘要:在对整块儿进行开方操作的时候,因为块儿内每一个元素都有各自的特点,所以不好去统一维护 这题的修改就只有下取整开方,而一个数经过几次开方之后,它的值就会变成 0 或者 1 如果每次区间开方只不涉及完整的块,意味着不超过2√n个元素,直接暴力即可 如果涉及了一些完整的块,这些块经过几次操作以后就会都变成 阅读全文
posted @ 2018-08-23 19:15 静听风吟。 阅读(498) 评论(0) 推荐(0)
摘要:块儿外的元素还是暴力 为了快速求答案,要提前预处理每个块儿的元素和 区间修改的时候,不完整的块儿直接修改,顺便更新元素和 完整的块儿还是打标记 阅读全文
posted @ 2018-08-23 19:03 静听风吟。 阅读(897) 评论(0) 推荐(0)
摘要:刚才是查询比指定的数x小的数有多少个 这里是查询比指定的数x小的最大的那个数是啥 其实只要把块内查询的二分稍作修改即可 在块内维护其它结构使其更具有拓展性,比如放一个 set ,这样如果还有插入、删除元素的操作,会更加的方便 注意分块儿大小,瞎改容易RE 阅读全文
posted @ 2018-08-23 18:08 静听风吟。 阅读(343) 评论(0) 推荐(0)
摘要:本题的分块儿需要提前预处理,预处理的时候就是把每块儿内元素排序,这样在查询的时候就可以二分查找了,从而减少了查询的效率 当然对于块儿外元素还是暴力查找,最大查找2m次也就是2√n次 区间加法还是同样适用一个修改标记,但是对于首尾的不完整块儿在修改之后这两块儿可能会出现乱序的情况 重新排序一下就好了 阅读全文
posted @ 2018-08-23 17:51 静听风吟。 阅读(366) 评论(0) 推荐(0)
摘要:们把每m个元素分为一块,共有n/m块 每次区间加的操作会涉及O(n/m)个整块 以及区间两侧两个不完整的块中至多2m个元素 我们给每个块设置一个加法标记 每次操作对每个整块直接O(1)标记 不完整的块由于元素比较少,暴力修改元素的值 每次询问时返回元素的值加上其所在块的加法标记 这样每次操作的复杂度 阅读全文
posted @ 2018-08-23 17:34 静听风吟。 阅读(347) 评论(0) 推荐(0)
摘要:莫队算法是用来处理一类无修改的离线区间询问问题 莫队的精髓就在于,离线得到了一堆需要处理的区间后,合理的安排这些区间计算的次序以得到一个较优的复杂度 代表题目是BZOJ2038这道题 进行区间询问[l,r],输出该区间内随机抽两次抽到相同颜色袜子的概率 分母就是n*n(表示两两袜子之间的随机组合), 阅读全文
posted @ 2018-08-23 16:46 静听风吟。 阅读(213) 评论(0) 推荐(0)
摘要:一般的二叉堆支持的操作有插入任意值并调整堆,删除最小值并调整堆,调整堆之后我们可以O(1)取得最小的结点,这是相对于小根堆而言的 这里补充说明一下优先队列不能完成但是二叉堆可以完成的事情,那就是删除指定位置元素的值,优先队列只允许弹出堆顶元素 但是一般的二叉堆可以删除任意元素 这是对之前介绍的手写堆 阅读全文
posted @ 2018-08-23 16:22 静听风吟。 阅读(236) 评论(0) 推荐(0)
摘要:利用可持久化Trie树实现范围内取值异或最大值 如果标题没有表达清楚意思,可以看这里的题干: 然后根据异或的性质,异或一个数两次相当于没有异或,那么我们可以维护一个异或前缀和 有了异或前缀和之后我们就可以通过前缀和的形式O(1)提取出任意的一个异或区间出来 然后就可以把题目转化成这样的形式 求max 阅读全文
posted @ 2018-08-22 20:05 静听风吟。 阅读(711) 评论(0) 推荐(0)