随笔分类 - 数据结构——主席树
摘要:题意: 给一个串$S$,$length\leq 1e5$,$Q\leq1e5$个询问,每次询问输出和$S_lS_{l+1}\dots S_r$长得一模一样的第$k$个子串的开头位置。 思路: 用后缀数组处理一下,那么所有相同子串最后的$sa$都会靠在一起,所以找到对应的$height$位置,然后向左
阅读全文
摘要:题意: 标记为$1 n$的竹子,$q$个询问,每次给出$l,r,x,y$。要求为砍区间$l,r$的柱子,要求砍$y$次把所有竹子砍完,每次砍的时候选一个高度,把比他高的都砍下来,并且这$y$次砍下来长度都相等,问第$x$次砍在什么高度。 思路: 显然就是要求选一个高度砍,使得剩下的高度为$(sum[
阅读全文
摘要:题意: 有$n$根长度不一的棍子,q次询问,求$[L,R]$区间的棍子所能组成的周长最长的三角形。棍长$\in [1, 1e9]$,n$\in [1, 1e5]$。 思路: 由于不构成三角形的数组为菲波那切数列,所以当棍数超过44时,长度超过1e9,所以从最大开始数最多不超过45次就能找到构成三角形
阅读全文
摘要:题意:在一个射击游戏里面,游戏者可以选择地面上【1,X】的一个点射击,并且可以在这个点垂直向上射击最近的K个目标,每个目标有一个价值,价值等于它到地面的距离。游戏中有N个目标,每个目标从L覆盖到R,距离地面高度D。每次射击一个目标可以得到目标价值大小的分数,每次射击以后目标不会消失。如果在该点上方的
阅读全文
摘要:题意:给出一棵树,给出每条边的权值,现在给出m个询问,要你每次输出u~v的最短路径中,边权 <= k 的边有几条 思路:当时网络赛的时候没学过主席树,现在补上。先树上建主席树,然后把边权交给子节点,然后数量就变成了 u + v - lca * 2。专题里那道算点权的应该算原题吧。1A = =,强行做
阅读全文
摘要:题意:有A1 ~ An组成的数组,给你l r,L = min((l + ans[i - 1]) % n + 1, (r + ans[i - 1]) % n + 1),R = max((l + ans[i - 1]) % n + 1, (r + ans[i - 1]) % n + 1),你先需要的到L
阅读全文
摘要:题意:问你区间有几个不同的数 思路:主席树nb。我们知道主席树每一个root都存着一棵权值线段树,现在我们在每个root中存位置,也就是01表示这个位置存不存在。然后我们用一个fa[a[i]]表示a[i]这个数在前面出现的位置。如果没有在前面出现过,那么我们直接把这个位置变成1,;如果出现过了,我们
阅读全文
摘要:题意: 给一个数组A[1] ~ A[n],有4种操作: Q l r询问l r区间和 C l r v给l r区间每个数加v H l r t询问第t步操作的时候l r区间和 B t返回到第t步操作 思路: 用主席树维护常规的线段树。我们之前已经知道了主席树单点更新,只要新增一条链就ok了,区间更新也有点
阅读全文
摘要:题意:问区间内不超过k的个数 思路:显然主席树,把所有的值离散化一下,然后主席树求一下小于等于k有几个就行。注意,他给你的k不一定包含在数组里,所以问题中的询问一起离散化。 代码:
阅读全文
摘要:题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高。那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出权值线段树前缀和,相减就是区间前缀和。而且我维护也只要改logn棵树就好了。具体看JQ博客。 代码:
阅读全文
摘要:题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点u到源点1的权值线段树,那我求点u到v的所有点,显然是 u + v - lca - fa[lca],
阅读全文
摘要:题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的。 具体可以看q学姐的B站视频 代码:
阅读全文