随笔分类 -  数据结构

摘要:通常,线段树是一个log的。 但是,有的用于解决特殊问题的线段树,是两个log的。 这个额外的log有两种情况: 第一种就是添加的标记比较特殊,使得pushdown时可能递归。 通过诡异证明,使得均摊复杂度为O(nlog2n)。 第二种就是pushup时,需要递归到其中一个子树,这样每次pus 阅读全文
posted @ 2021-01-24 22:00 lnzwz 阅读(291) 评论(0) 推荐(0) 编辑
摘要:题意: 给定xd,求x子树里深度不超过dep[x]+d的所有点中有多少种颜色。 强制在线。 一般的,询问区间颜色数时,可以求出每个数的后继,然后就变成了区间内大于某数的数,进而使用树状数组或主席树。 然而,询问树上的颜色数,还有一种更好的方法: 考虑某种颜色的贡献: 把这种颜色的所有点 阅读全文
posted @ 2020-08-04 22:19 lnzwz 阅读(148) 评论(0) 推荐(0) 编辑
摘要:涉及到RMQ,RMQ之和,最大子矩形等,子矩形数量等问题,可以考虑笛卡尔树。 笛卡尔树就是每次找到区间中的最值,按照这个位置将区间分为2份递归建树。 这样,最值就是lca了。 RMQ之和就是lca之和,可以枚举lca算贡献。 最大子矩形等就是每个点的权值乘以它对应的区间长度的最大值。 子矩形数量就是 阅读全文
posted @ 2020-08-04 21:42 lnzwz 阅读(230) 评论(0) 推荐(1) 编辑
摘要:[toc] kd 树是一种分割 k 维数据空间的数据结构。 它通常被用来解决 k 维空间中的距离最值 ( 第 k 小值 ) 问题。 当然,它也能解决其它问题。 建树的方法: 假设我们的平面上的点的序列为 [l,r] 。 我们先选定一个维度为基准,不妨假设是 x 维度。 然后我们找出 [l,r] 这些 阅读全文
posted @ 2020-05-02 21:07 lnzwz 阅读(219) 评论(0) 推荐(0) 编辑
摘要:题意: 给定一个点数为 n,边数为 m,权值不超过 109 的带权连通图,没有自环与重边。 现在要求对于每一条边求出,这条边的边权最大为多少时,它还能出现在所有可能的最小生成树上,如果对于任意边权都出现,则输出 1。 这里写一个用倍增的O(nlogn)做法。 先求出一个最小生成树。 阅读全文
posted @ 2019-10-25 18:57 lnzwz 阅读(195) 评论(0) 推荐(2) 编辑
摘要:题意: 有 n 群怨灵排成一排,燐每秒钟会选择一段区间,消灭至多 k 只怨灵。 如果怨灵数量不足 k,则会消灭尽量多的怨灵。 燐作为一只有特点的猫,它选择的区间是不会相互包含的。它想要知道它每秒最多能消灭多少怨灵。 要求:在之前每次都消灭尽量多的怨灵的情况下,求第 i 秒最多能消灭的怨灵的数量。 首 阅读全文
posted @ 2019-10-03 17:34 lnzwz 阅读(309) 评论(0) 推荐(0) 编辑
摘要:[toc] 首先,要求可以离线 。 线段树分治有两种。 类型一 操作基于区间,单点询问。 有时,进行的一种操作可以快速完成,但是,要实现这种操作的逆操作较难。 因为,通常情况下,需要实现的逆操作都是很久以前执行的。 但是,如果只撤销上次操作,就会简单得多。 比如,维护一些连通性,或直径,线性基等问题 阅读全文
posted @ 2019-09-30 22:02 lnzwz 阅读(858) 评论(0) 推荐(0) 编辑
摘要:题意: 有两个长度为n的序列,要求从每个序列中选k个,并且满足至少有l个位置都被选,问总和最大是多少。 1lkn2105。 首先,记录当前考虑到的位置i,第一个选的数量a, 第二个选的数量b,都被选的数量c,可以做到O(n4), 卡常后能过$n\ 阅读全文
posted @ 2019-08-25 21:54 lnzwz 阅读(373) 评论(0) 推荐(2) 编辑
摘要:[toc] 注:部分参考 https://www.luogu.org/blog/gkxx is here/what the hell is ddp 动态DP,就是一个十分简单的DP加了一个修改操作。 先看些例题: 例题1:模拟赛题 【问题描述】 某高校教学楼有 n 层,每一层有 2 个门,每层的两个 阅读全文
posted @ 2019-08-24 21:43 lnzwz 阅读(244) 评论(0) 推荐(0) 编辑
摘要:主席树。 推下式子,发现点的深度和好算,lca深度和不好算。 lca深度之和有个套路:先给a到根路径+1,再算b到根的和。 如果可以离线,即LNOI的LCA。本题强制在线,可持久化。 由于区间修改,使用标记永久化。 注意修改要复制全,关于和的修改有些细节: cpp int xiugai(int i, 阅读全文
posted @ 2019-08-19 14:03 lnzwz 阅读(122) 评论(0) 推荐(0) 编辑
摘要:李超线段树可以支持如下操作: 1. 在区间l r加入线段y=kx+b。 2. 询问直线y=x与所有线段交点的y坐标最值。 例题: "模板题" 做法: 对于线段树的每个区间,维护“最优线段”,即上面露出最多的线段。 在插入一条线段时,同样对应到区间上。 考虑如何在线段树的区间上加入一条 阅读全文
posted @ 2019-08-15 21:32 lnzwz 阅读(306) 评论(0) 推荐(0) 编辑
摘要:"题目链接" 题目描述: pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 的倍数。他想研究对于二进制,是否也有类似的性质。 于是他生成了一个长为n 的二进制串,希望你对于这个二进制串的一个子区间,能求出其有多少位置不同的连续子串,满足在重新排列后(可包含前导0)是一个 阅读全文
posted @ 2019-08-13 20:16 lnzwz 阅读(315) 评论(0) 推荐(0) 编辑
摘要:"题目链接" 题意: 给你一个n元环,你可以在0时刻从任意一个位置出发,每一秒可以选择往后或者留在原地 每个点有个参数Ti,当你走到i的时间t=Ti时你就可以把i标记 问你把整个环上的点都标记最小需要多长时间,带修改Ti,强制在线 好难的题。 首先,有等待操作不太好弄。 阅读全文
posted @ 2019-08-12 20:47 lnzwz 阅读(178) 评论(0) 推荐(0) 编辑
摘要:题意:w×h网格中有n个点,m条边。每条边可以从p点花费t时间到一个矩形中的任意点,求1号点到每个点的最少时间。 $1 include define max(a,b) a b?a:b define min(a,b) ax ((SPx )b) x; } int cmpy(const void a,co 阅读全文
posted @ 2019-07-26 16:16 lnzwz 阅读(403) 评论(0) 推荐(0) 编辑
摘要:使用线段树。 对于取走序列中的一个数并放到尾部这样的操作,我们可以使用数组和线段树解决,方法如下: 例:1 7 3 5 7 3 取走5,放到尾部。1 7 3 5 7 3 1 7 3 __ 7 3 5 (下划线表示空) 但这样查询第K个数时不能直接访问数组中的第K个元素(因为有空格),而扫一遍的复杂度 阅读全文
posted @ 2019-07-25 20:27 lnzwz 阅读(199) 评论(0) 推荐(0) 编辑
摘要:OVOO题解: 求包含根节点的第k小连通块的权值,连通块的权值定义为连通块中包含的所有边的权值之和。 使用A 算法(估价函数为0),维护一个优先队列,优先队列中储存连通块的权值,上一次选的边权和当前连通块周围的可选边集合构成的可并堆,每种状态有如下两种扩展方式: (1)删除上一次选的边,并选一条当前 阅读全文
posted @ 2019-07-25 20:15 lnzwz 阅读(584) 评论(0) 推荐(0) 编辑

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