随笔分类 -  数据结构

摘要:SP10707 COT2 - Count on a tree II 参考:树上莫队 树上莫队和普通的莫队差不多,只是把区间从普通的数组,转到欧拉序上(其实也就是括号序) 该问题求解的是 x,y 两个点之间的最短路径上,有多少个不同颜色的点 对于这个问题,分两种情况讨论 \(lca(x,y)=x\ o 阅读全文
posted @ 2021-05-08 13:47 caoanda 阅读(77) 评论(0) 推荐(0) 编辑
摘要:D - Cut 对于一道题目,如果没有别的想法,那么就可以先从它的朴素解法入手,然后再想能不能找到优化它的方法。 对于这道题而言,朴素的解法就是用一个数组来维护每一个位置失配的最远位置,可以开一个数组fail[maxn]进行记录。但是在最极端的情况下,每次查询会被卡成O(n)的,所以,这个地 阅读全文
posted @ 2021-04-22 16:29 caoanda 阅读(229) 评论(0) 推荐(0) 编辑
摘要:1007 Tree 这道题的解题思路就是树形 dp,在求解过程中,尤其要注意 k 为0和1的时候的情况讨论。细节决定了这道题能不能A。 // Created by CAD #include <bits/stdc++.h> #define ll long long using namespace st 阅读全文
posted @ 2020-08-07 20:51 caoanda 阅读(259) 评论(0) 推荐(0) 编辑
摘要:O(log(n))求第k个父亲节点 参考:树上倍增的写法和应用(详细讲解,新手秒懂) // Created by CAD #include <bits/stdc++.h> using namespace std; const int maxn=5e5+5; vector<int> g[maxn] 阅读全文
posted @ 2020-08-05 09:33 caoanda 阅读(141) 评论(0) 推荐(0) 编辑
摘要:###倍增法求最近公共祖先 参考:题解 P3379 【模板】最近公共祖先(LCA) 参考:树上倍增的写法和应用(详细讲解,新手秒懂) // Created by CAD #include <bits/stdc++.h> using namespace std; const int maxn=5e5+ 阅读全文
posted @ 2020-08-05 09:31 caoanda 阅读(118) 评论(0) 推荐(0) 编辑
摘要:"D. Multiset" 后面才知道 的复杂度是O(n)的,所以 t 了很多次。 当需要进行很多次插入和删除第 k 位数这两种操作的时候,可以用树状数组来对其进行优化, 表示的就是 i 这个数在当前序列里排的位置,求第 k 位数的大小可以用二分进行优化,这样复杂度就是$O(log(log(n) 阅读全文
posted @ 2020-05-20 17:55 caoanda 阅读(206) 评论(0) 推荐(0) 编辑
摘要:树的直径及其性质 参考: "树的直径及其性质与证明" ①直径两端点一定是两个叶子节点 ②距离任意点最远的点一定是直径的一个端点,这个基于贪心求直径方法的正确性可以得出 ③如果第一棵树直径两端点为(u,v),第二棵树直径两端点为(x,y),用一条边将两棵树连接,那么新树的直径一定是$u,v,x 阅读全文
posted @ 2020-04-10 13:49 caoanda 阅读(597) 评论(0) 推荐(0) 编辑
摘要:"B. 齐心抗疫" 树的直径有一个性质,即对于树上的每一个点,要找到一个最短路距离最远的点,结果一定是直径的两端点之一 所以遍历 n 个点,每次都假设当前点为 值较大点,然后找到一个距离最远的点,即直径的端点,最后贪心即可。 阅读全文
posted @ 2020-04-10 13:24 caoanda 阅读(180) 评论(0) 推荐(0) 编辑
摘要:"C2 Skyscrapers (hard version)" 分别用 表示在 i 位置能取到的左边的值之和,右边的值之和。 利用单调栈的思想。 降低复杂度的方法是,充分利用重复计算的数据,将其保存下来,避免多次计算。 阅读全文
posted @ 2020-02-24 19:19 caoanda 阅读(287) 评论(0) 推荐(0) 编辑
摘要:线段树树链剖分(边权) 阅读全文
posted @ 2020-02-18 20:08 caoanda 阅读(214) 评论(0) 推荐(0) 编辑
摘要:"E. 1 Trees and Queries" 该题需要用 lca 进行优化。 在树中求两点间的距离的方法为: 阅读全文
posted @ 2020-02-17 13:31 caoanda 阅读(182) 评论(0) 推荐(0) 编辑
摘要:分块 数据: 初始化: 区间查询: 区间更新和区间查询差不多,有些时候需要用一个 来进行整块区间的加减操作。 阅读全文
posted @ 2020-02-10 15:49 caoanda 阅读(119) 评论(0) 推荐(0) 编辑
摘要:"K th Number" 两种写法:分块、线段树(归并树) 区间种第 k 个数的特点是:①在区间中不超过 x 的数不少于 k 个②在区间中小于 x 的数有不到 k 个 分块: 所以可以对答案进行二分,然后在判断是否满足的时候利用分块进行优化。 如果直接用n作为桶的大小的话,复杂度 阅读全文
posted @ 2020-02-09 23:39 caoanda 阅读(159) 评论(0) 推荐(0) 编辑
摘要:"A Simple Problem with Integers" 这道题目只涉及区间修改以及区间查询,所以只要我们利用线段树或者树状数组进行优化,这道题就很容易解决了。 树状数组:因为树状数组本质上之能涉及单点更新,所以,当遇到区间更新的时候,可以尝试将其通项分解为 n 个维度,这样就可以通过 n+ 阅读全文
posted @ 2020-02-09 14:28 caoanda 阅读(136) 评论(0) 推荐(0) 编辑
摘要:逆序对 所求的交换次数等价于满足iaj(i,j)的数对的个数(这种数对的个数叫做逆序数)。 可以利用树状数组来求解逆序对的问题 阅读全文
posted @ 2020-02-09 11:28 caoanda 阅读(144) 评论(0) 推荐(0) 编辑
摘要:ST表 在O(30n)的复杂度内建ST表 查询复杂度为O(log(n)) 模板求的是区间最大值,如果需要求最小值,只需要把 改为 即可。 阅读全文
posted @ 2020-02-08 19:27 caoanda 阅读(141) 评论(0) 推荐(0) 编辑
摘要:"Crane" 因为这道题需要需要对数据进行多次修改以及多次查询,而且涉及区间修改,所以最高效的办法就是利用线段树对其进行优化。 阅读全文
posted @ 2020-02-08 16:20 caoanda 阅读(289) 评论(0) 推荐(0) 编辑
摘要:"食物链" 因为不知道要输入的 x ,是属于A,B,C,哪个位置上的,所以把空间开了三倍,每一种状态都保存一下 如果 x 与 y 同类,那么 为`true`。 如果 x 吃 y 那么, 为`true` 这个题卡的点在于, 会卡 ,所以应该用 进行读入 代码: 阅读全文
posted @ 2020-01-15 16:46 caoanda 阅读(344) 评论(0) 推荐(0) 编辑
摘要:并查集(防退化) 防退化的关键操作在于,记录每一个点的高度,合并的时候,将高度较小的点并到高度较大的点上去。 同时还有一个优化技巧就是路径压缩,它会改变树的高度,但是为了方便起见,也不修改 high 的值 合并操作: 阅读全文
posted @ 2020-01-15 14:54 caoanda 阅读(148) 评论(0) 推荐(0) 编辑
摘要:"E Common Number" 参考: "Codeforces Round 608 (Div. 2) E Common Number (二分 思维 树结构)" 具体做法可详见参考博客。 关键在于在分了奇偶之后,就是有序的了 在数据范围很大的时候,要尝试降低其复杂度,对答案进行二分就是一种降低复杂 阅读全文
posted @ 2020-01-04 19:35 caoanda 阅读(184) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示