随笔分类 -  数据结构

摘要:Splay yyb神仙的blog 例题 luogu P2042 [NOI2005]维护数列 阅读全文
posted @ 2020-08-31 23:58 With_penguin 阅读(112) 评论(0) 推荐(0)
摘要:这篇文章写的贼好 例题: P4688 [Ynoi2016]掉进兔子洞 题解 阅读全文
posted @ 2020-07-16 11:20 With_penguin 阅读(108) 评论(0) 推荐(0)
摘要:bitset优化莫队。 由于bitset并不能存可重集,所以我们考虑给每种元素在bitset里留 \(k\) 个位置(\(k\) 为这种元素的个数)。我们只需要在离散化的时候不去重,然后把 \(p\) 放进bitset中第 \(p-cnt_p\) 个位置就行了(\(cnt_p\) 为bitset当前 阅读全文
posted @ 2020-07-16 11:18 With_penguin 阅读(120) 评论(0) 推荐(0)
摘要:对每一条边单独考虑其贡献。 我们现在想算有多少连续区间跨过了这条边。正难则反,我们考虑有多少连续区间不跨过这条边,最后用总的减去这些。所以我们只需要计算当前子树内和子树外的连续区间的贡献就行。 考虑 dsu on tree。子树内用并查集维护并计算极长子段的贡献,子树外用set维护其补集并计算贡献即 阅读全文
posted @ 2020-07-12 14:56 With_penguin 阅读(230) 评论(0) 推荐(0)
摘要:考虑点分治。 考虑如何合并线段 \(\sum\limits_{i=1}^{n}i\times a[i]\) 和 \(\sum\limits_{j=1}^{m}j\times b[j]\)。新线段的表达式 \(\sum\limits_{i=1}^{n}i\times a[i] + \sum\limit 阅读全文
posted @ 2020-07-11 20:58 With_penguin 阅读(119) 评论(0) 推荐(0)
摘要:首先考虑判断两个点 \(a,b\) 在一个询问 \((l,r,x)\) 下连通:\(path(a,b)\) 上的点的编号都在 \(l \sim r\) 之间,可以用倍增预处理。 对原树建立点分树。对于每个询问 \((l,r,x)\),我们考虑找到这样一个点: 这个点是 \(x\) 在点分树上的祖先 阅读全文
posted @ 2020-07-11 17:31 With_penguin 阅读(130) 评论(0) 推荐(0)
摘要:闲聊 看到树上路径问题点分治肯定可以做 看了一下其他题解好像没有具体介绍如何不重不漏地计数以及一些细节(其实是我太菜了没看懂 蒟蒻我做点分题还没有用过容斥定理,一般都是在每颗子树里跑一遍的时候直接累加前面已经跑过的贡献QWQ 前置芝士 点分治 平衡树(其实可以不用,但因为我不太会容斥,而且这题边权比 阅读全文
posted @ 2020-07-10 06:20 With_penguin 阅读(187) 评论(0) 推荐(0)
摘要:强行把李超线段树搬到树上。然后这题我调了两天,最后发现数组开小了。。。 我们发现题目就是把凸包放到树上然后求最值。用树剖把树化为序列,然后直接李超线段树就可以了。 惨痛的教训:一共插入的线段数量是 \(O(nlogn)\) 级别的,数组一定要开大/lb。 代码: #pragma GCC optimi 阅读全文
posted @ 2020-07-08 01:13 With_penguin 阅读(215) 评论(0) 推荐(0)
摘要:\(dsu\ on\ tree\) 是一个树上优化暴力,在统计每个子树信息的时候可以做到 \(O(nlogn)\) 大致思路:先轻重链剖分,然后统计每棵子树信息的时候先递归所有轻儿子(回溯时清空信息),最后递归重儿子(回溯时不清空信息)。 最重要的就是时间复杂度分析了吧(其实非常简单):我们发现一个 阅读全文
posted @ 2020-06-25 10:48 With_penguin 阅读(129) 评论(0) 推荐(0)
摘要:先考虑一个简单容斥:设 \(val(x)\) 表示 \(x\) 子树内所有点作为 \(LCA\) 的贡献之和,那么以 \(x\) 为 \(LCA\) 的贡献就是 \(val(x)-\sum\limits_{v\in son\ of\ x}val(v)\)。 现在的问题就是如何求 \(val(x)\) 阅读全文
posted @ 2020-06-25 10:30 With_penguin 阅读(285) 评论(0) 推荐(0)
摘要:题目大意是维护一个序列,规定区间加法为给区间每个数加上对应的 \(fibnacci\) 数列的一项。 我刚拿到题想到了直接下传标记、标记永久化等一堆显然错误的算法。错误原因是标记不能合并,所以时间复杂度得不到保证。 看到一种非常神仙的做法,用到了 \(fibnacci\) 数列的一个性质: \[ f 阅读全文
posted @ 2020-06-25 00:22 With_penguin 阅读(135) 评论(0) 推荐(0)
摘要:这题因为一些弱智错误调了好久。。。 考虑如何判断一个数是否是一堆数的中位数(不经过排序):记你想要判断的数为$mid$,然后把 \(\geq mid\) 的数设为$1$, \(\leq mid\) 的数设为$-1$,然后给这些数求个和,若$sum<0$,则 \(mid\) 比真正的中位数大,反之则比 阅读全文
posted @ 2020-06-16 06:39 With_penguin 阅读(72) 评论(0) 推荐(0)
摘要:操作过程在那里写的非常清楚了,这里主要粘一下代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; typedef long long LL; const i 阅读全文
posted @ 2020-06-11 01:33 With_penguin 阅读(93) 评论(0) 推荐(0)
摘要:我学习的时候看的blog 珂朵莉树(又称ODT,Old Driver Tree),可以用来解决一类有区间赋值并且数据随机的问题。 其实ODT就是两个主要函数($Assign$和$Split$ 操作),时间复杂度的保证其实也都来源于此,其他所有的操作都是直接暴力解决。特别要注意的是,此题一定要有区间整 阅读全文
posted @ 2020-06-10 21:04 With_penguin 阅读(413) 评论(0) 推荐(0)
摘要:线段树分治真的难写。 二分图判定的条件是图中不存在奇环。我们可以用带权并查集来维护。现在的难点就在于对线段树$DFS$时回溯的时候如何删除影响。 这里可以使用可删并查集:注意到我们加入影响和删除影响的过程就是维护栈的过程,我们可以放弃并查集的路径压缩(我们按秩合并也可以保证复杂度),并在加入边时记录 阅读全文
posted @ 2020-06-10 02:22 With_penguin 阅读(94) 评论(0) 推荐(0)
摘要:普通线段树 普通的线段树先不谈,我们来看一点比较高级的科技。 直接给一些好题: luogu CF446C DZY Loves Fibonacci Numbers 题解 线段树分治 啊啊啊今天突然发现全机房只有我不会线段树分治。。。 有时我们会在时间轴上进行一些操作,或者清除我们之前的操作。这时候我们 阅读全文
posted @ 2020-06-10 02:07 With_penguin 阅读(121) 评论(0) 推荐(0)
摘要:可持久化权值线段树 当我们需要建很多棵线段树而空间又不够用时,我们可以寻找这些线段树间的联系。如果这些树的差别不太大,那么我们可以考虑使用可持久化权值线段树来大大减少空间复杂度。 例题: luogu P4137 Rmq Problem / mex 题解 luogu P2839 [国家集训队]midd 阅读全文
posted @ 2020-05-06 22:12 With_penguin 阅读(135) 评论(0) 推荐(0)
摘要:区间求 mex 问题。 对序列建一棵以权值为下标的主席树。每个节点记录:当前区域内每个权值的前一个出现位置的最小值。查询 \([l,r]\) 内的 mex 时拿出 \(r\) 这棵线段树,在上面操作:如果左边区间有最小值小于 \(l\),那么递归到左区间,否则递归进入右区间。 代码: #includ 阅读全文
posted @ 2020-05-06 22:10 With_penguin 阅读(125) 评论(0) 推荐(0)
摘要:左偏树get! 可并堆望文生义就是可以快速合并的堆,左偏树是其中的一种。 首先放开左偏树不谈,我们想想如何合并两个堆$x$和$y$(小根堆): 1. 首先比较两个堆的堆顶,我们默认$x$的堆顶元素更小(否则的话交换$x、y$就好了),那么$x$的堆顶显然是新堆(指合并后的堆)的堆顶。 1. 然后的话 阅读全文
posted @ 2020-05-02 16:40 With_penguin 阅读(136) 评论(0) 推荐(0)
摘要:这个在我 "讲左偏树的模板" 里写的很清楚了,直接上个代码吧: 阅读全文
posted @ 2020-05-02 16:39 With_penguin 阅读(116) 评论(0) 推荐(0)