随笔分类 - 数据结构们
摘要:Easy Version Hard Version Hard Version的做法可以从Easy Version 用数据结构优化得到。 首先我们想一下,什么情况需要进行操作?显然是的时候,并且当的时候将会无解。 那么当的时候,应该怎
阅读全文
摘要:[link](https://codeforces.com/contest/1851) #### A 非常简单的比较大小问题 ```cpp #include #include #include #include #include #include #include #include #include
阅读全文
摘要:[link](https://www.luogu.com.cn/problem/P1253) 非常直白的线段树题目 要注意负数的问题以及吮吸 ```cpp #include #include #include #define int long long using namespace std; in
阅读全文
摘要:Jisoo 我们来想一下序列上的是怎么实现的 每次二分,把当前节点插进去替换,来让答案尽可能的更优。 换到树上呢?对于以作为根节点的子树,我们可以发现去掉其实都无所谓了,子树之间没有相互的影响,那就开个集合全扔进去就行了 然后放进u,并且按照类似于序列情况的方法进行
阅读全文
摘要:Jisoo 这是一种叫线段树合并的东西。 为了简化,我们需要动态开点。 并且一开始为每一个节点建一个线段树,当然是动态开点的 然后合并就行了,相同的线段树节点加起来,只有一个有的就返回另一个 记一个根,并且并查集一下。 #include<cstdio> #include<iostream> #inc
阅读全文
摘要:Jennie 分块,对于每一个块,排个序 就可以了 #include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<stack> #include<algorithm>
阅读全文
摘要:可持久化线段树 如果我们要维护一个可持续的,支持查询历史版本的数组该怎么做 给每一个版本建立一颗线段树?那太占空间了。 我们可以不同版本公用一些节点,对于每个版本,只把和上一个版本不一样的部分建立线段树的新节点。这样我们就有了可持久化线段树。 Lisa 需要的前置知识:动态开点。 依照上面的思想,这
阅读全文
摘要:左偏树 一种可以合并的堆 前置知识 dist 对于一棵二叉树,我们定义 外节点 为左儿子或右儿子为空的节点,定义一个外节点的 为 ,一个不是外节点的节点 为其到子树中最近的外节点的距离加一。空节点的dist为0。 那么左偏树就是一颗满足堆的性质的二叉树,它的左儿子的dist大于等于右儿子的 核心 核
阅读全文
摘要:左偏树 一种可以合并的堆 前置知识 dist 对于一棵二叉树,我们定义 外节点 为左儿子或右儿子为空的节点,定义一个外节点的 为 ,一个不是外节点的节点 为其到子树中最近的外节点的距离加一。空节点的dist为0。 那么左偏树就是一颗满足堆的性质的二叉树,它的左儿子的dist大于等于右儿子的 核心 核
阅读全文
摘要:Treap treap是啥,是一种平衡树,tree+heap 众所周知,二叉平衡树一旦退化,复杂度将会很可怕。 treap则给每一个节点附上了一个随机的值,然后利用旋转操作,让这个二叉搜索树同时也满足堆的性质。期望下可以达到的复杂度了。 具体怎么实现呢 大部分的操作和一般的二叉
阅读全文
摘要:Lisa 运用一点初中知识可以知道 维护一下区间平方和和区间和就可以处理了 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int f; i
阅读全文
摘要:Jennie 和常规的求逆序对差不多 在从根节点往下走的时候,我们必须要避免不在他子树内的点的影响 那就先减去他们呗。 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm>
阅读全文
摘要:Jennie 很有意思 首先贪心的对每一个a中字符匹配B中出现的第一个对应未匹配字符,这样的话就有了顺序 然后每一次的操作是交换相邻的字符,很像某种求逆序对方式对不对 然后这个题就是求逆序对 #include<iostream> #include<cstdio> #include<algorithm
阅读全文
摘要:Jisoo 对于一个等差数列? 直接维护这个区间的首项和公差就可以了 最后的答案反正只有单点查询(区间也差不多) 返回那个小区间的“首项”就可以了 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #d
阅读全文
摘要:jennie 很经典的线段树维护最大子段和 我们只需要维护一下每一个区间的最大前缀,后缀,子段和区间和 对于每一个区间 他的最大前缀可能是左儿子的最大前缀或者左儿子的和加上右儿子最大前缀 后缀,同理 最大子段可能是左儿子最大后缀加上右儿子最大前缀或者说左,右儿子的最大子段 #include<iost
阅读全文
摘要:Jennie 显然可以模拟,但是谁会喜欢写高精和逆元呢? 需要撤销乘法操作,该怎么做呢 如果说一个个乘法结合起来的话,那么撤销就是把一个数变成1 那么就是一个线段树的问题了 #include<iostream> #include<cstdio> #include<algorithm> #includ
阅读全文
摘要:一开始写了个傻逼做法 #include<cstdio> #include<algorithm> using namespace std; int n; int a[1000001]; int lim; int ans; int maxx; int po; int main(){ scanf("%d"
阅读全文
摘要:Aimee set练手 insert有一个pair的返回值,second代表插入成功没有 s .end()返回值是最后元素的下一个位置。 lowerbound是第一个大于等于 upperbound是最后一个小于等于 #include<set> #include<cstring> #include<a
阅读全文
摘要:Aimee "Doctor,你这水平下降的有点。。。" '"我怎么知道能手残写了个return p" 很显然,那条路径一定在最大生成树上,然后在这条树上跑LCA即可 #include<iostream> #include<cstdio> #include<algorithm> #include<cs
阅读全文
摘要:Aimee 应该用线段树的,但是用树状数组就行 反正开方这个东西只能单点修改 最后用并查集优化一下 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define in
阅读全文