随笔分类 - 数据结构 - 线段树
摘要:$O(n^2)$ 的式子是好列的,然后我们发现这是一个关于前后缀的转移. 用线段树合并优化这一过程. 具体地,分别维护 $x,y$ 的后缀和. 这里要注意:由于这道题中两个不同子树肯定没有交集,所以在线段树合并的时候肯定会合并到一个点,使得两个树中一个为空. 然后由于另一个是空的,就没有合并的必要了
阅读全文
摘要:李超线段树模板题,要同时维护最大值和最小值,然后求交点的时候注意 double 的转换 code: #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <vector> #include
阅读全文
摘要:第一次学这个东西,感觉还是挺好写 + 好用的. code: #include <bits/stdc++.h> #define ll long long #define M 50000 #define N 100008 #define eps 1e-12 #define lson now<<1 #de
阅读全文
摘要:笛卡尔树好神奇啊! 我们考虑对白色区域维护以最大值为中点笛卡尔树,然后考虑怎么合并左右区间: 令 $f[h]$ 表示最高高度为 $h$ 的最大保留权和,v 表示当前笛卡尔树节点的权值. 考虑如何合并左右区间: 显然,如果要将 $f[y]$ 贡献给 $f[x]$,那么 $x$ 要大于 $y.$ 我们将
阅读全文
摘要:新学了一下笛卡尔树,这道题是模板题,统计一下以 $x$ 为 lca 的点对就行. 然后统计的话用线段树合并 + 启发式合并就行了. code: #include <bits/stdc++.h> #define N 100006 #define ll long long #define lson s[
阅读全文
摘要:大大大分类讨论,思路还是非常巧妙的. code: #include <bits/stdc++.h> #define ll long long #define lson now<<1 #define rson now<<1|1 #define N 100008 #define mod 99824435
阅读全文
摘要:$f$ 函数暴力计算的话是 $O(n)$ 的(用一个 $\frac{x}{y}$ 来保存每一步计算结果,然后依次合并) 我们将一段区间的结果写成 $\frac{ax+by}{cx+dy}$ 的形式,初始时 $(x=0,y=1)$,然后这样的话就可以将区间分治,然后左右区间合并了. 注意合并的时候要把
阅读全文
摘要:一眼吉司机线段树弱化版,但是这道题可以不用这么高级的数据结构. 直接用普通线段树,打一个 mx,mn 标记分别表示区间取 mn,max 然后 pushdown 的时候讨论一下大小关系即可. code: #include <bits/stdc++.h> #include "wall.h" #defin
阅读全文
摘要:这道题好麻烦的. 把次小值和最小值一起更新,WA 了半天. 这道题采用的是势能分析的做法,并没有用到 CPU 监控那道题中的打标记法. 有时间再研究一下这几类线段树的异同. code: #include <cstdio> #include <algorithm> #include <cstring>
阅读全文
摘要:Description 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C。 2)给出参数U,V,C,对于区间[U,V]里的每个数i,将a[i]赋值为max(a[i]+C,0)。 3)给出参数U,V,输出a[U],a
阅读全文
摘要:和 cpu 监控用的是一种做法. 令 $(a,b)$ 表示加上 a,再与 $b$ 取 max. 则 $(a,b)$ 与 $(c,d)$ 的历史最值合并可以看作是两个函数的合并,只需在 $(a,c)$ 中取一个 max,$(b,d)$ 中也取一个 max 即可. 仔细考虑一下标记的时间顺序:如果使用取
阅读全文
摘要:$(x,y)$ 表示加完 $x$,再对 $y$ 取 max 的操作. 那么有 $(a,b)+(c,d)=(a+c,max(b+c,d))$ 然后对于两个标记取 max 的话是 $(max(a,c),max(b,d))$ 知道这些之后就好做了. 一定要注意:先更新历史最值标记,然后再更新当前最值(因为
阅读全文
摘要:新学 segment-tree-beats. 这道题在区间取 min/max 的基础上还有一个区间加,那么显然要先做区间加,再取 min/max. code: // bzoj 最假女选手 #include <cstdio> #include <algorithm> #include <cstring
阅读全文
摘要:题意:给定一个数列,单点修改,求大于 $b_{i}$ 的极大连通块数目. 有一个常见的套路:考虑 $i$ 与 $i-1$. 当新加入 $i$ 时,$1$ ~ $a[i]$ 部分都新加入了一个连通块,然后我们发现我们多加了 $1$ ~ $min(a[i-1],a[i])$ 这一部分. 那么这就对应了一
阅读全文
摘要:显然,我们可以将每个东西的 $a,b$ 属性转换成二维坐标系中的点. 那么我们每次查询的时候查的是一个右下角矩阵. 没有被套的数量等于矩阵内总数量减去矩阵内可以套其他物品的数量. 我们考虑按照 $a$ 从大到小依次处理. 那么对于 $(x,y)$ 来说,显然匹配一个 $(x',y')$ 满足 $y'
阅读全文
摘要:显然,如果不出现重复数字的话直接贪心填就是正确的. 然而,当出现重复数字时这个贪心就错了. 将这个问题抽象成树是显然的. 我们先将所有数从大到小排. 对于大小为 $size[i]$ 的 $i$ 来说,肯定选当前能选的第 $size[i]$ 大的. (设为 $x$) 那么,选择完 $x$ 后,显然 $
阅读全文
摘要:大大大数据结构题. 我们发现,如果 $k=2$,答案就是树的直径. 而 $k>2$ 时,相当于选择 $k$ 个叶子,使得这些叶子的并最大. 我们有一个显然的贪心:$k+1$ 的答案一定是在 $k$ 的答案上加一个叶子. 如果不考虑修改,这其实就是长链剖分. 即 $k$ 时的答案就是大小为前 $k$
阅读全文
摘要:CF1305C 题解: 我们发现虽然 $n$ 很大,但是模数很小,所以相当于 $n$ 个数对 $m$ 取模后不能有重复数字. 那么其实这个 $n$ 最大也就是 $m$ ,直接 $O(m^2)$ 暴力算就行了. code: #include <bits/stdc++.h> #define ll lon
阅读全文
摘要:好神仙的一道字符串题! 由于后缀自动机+线段树合并的题做多了,看到复杂字符串的时候直接往 right 集合和后缀树那方面想了. 所以就没想出来 QAQ.... 这道题还是要从序列上来思考. 我们发现最优解一定可以表示成一个长度依次为 $1$ ~ $ans$ 字符串集合. 令 $dp[i]$ 表示以
阅读全文
摘要:你可以手画一下,然后发现求的其实就是 $[l,r]$ 区间内合法序列匹配个数. 用线段树维护一下括号序列就可以了. code: #include <bits/stdc++.h> #define N 1000005 #define ll long long #define lson now<<1 #d
阅读全文

浙公网安备 33010602011771号