数据结构专题
例 $1$
支持区间乘 $-1$ , 求区间最大子段和。
$lmax,lmin,rmax,rmin,ansmin,ansmax$ 大力维护即可。
时间复杂度 $O(n\log n)$ 。
例 $2$ (楼房重建)
求区间单调栈大小。
考虑线段树维护 $[l,r]$ 单调栈大小。
如何合并节点信息,可以发现左子树一定会是整个的子集,而对于右子树定义 $calc(pre,max)$, $pre$ 表示当前节点, $max$ 表示前面的最大值。
观察得到若对于右子树的左子树最大值小于 $max$,则直接递归右子树即可,否则左子树调用 $calc$ 函数,右子树的单调栈大小必为整个单调栈大小减去左子树单调栈大小,因为若答案更大则单调栈大小可以更大。
时间复杂度 $O(n\log^2 n)$ 。
例 $3$
求区间内颜色不同的曼哈顿距离最大值。支持单点修改。
将曼哈顿距离写成 $4$ 个的 $max$,对与每一个,例如 $(x1-y1)-(x2-y1)$ ,维护线段树上最大值,次大值,最小值,次小值,保证颜色不同。
做 $4$ 遍即可。
时间复杂度 $O(n\log n)$ 。
例 $4$ (FJOI2016 神秘数)
考虑只有一次询问,若当前能表示出来的数为 $[1,L]$,加入数 $a_i$。
当 $a_i\leq L+1$ 时, $[1,L]->[1,L+a_i]$,因为可以区间平移 $a_i$ 长度。
否则 $L+1$ 依然凑不出,输出答案。
将这个模型套到区间上,发现每次求的是区间内小于等于某数的和,可以通过主席树维护。
因为 $\sum a_i\leq 10^9$,可以暴力维护答案,因为每次答案至少翻倍。
时间复杂度 $O(m\log n\log \sum a_i)$
例 $5$
不会
例 $6$
不会
例 $7$
给定序列 $a$ ,求一个最长区间满足最多加入 $k$ 个数后 $sort$ 为一个公差为 $d$ 的等差数列。
枚举 $r$,发现 $l$ 单调不降,所以问题变为求 $[l,r]$ 是否满足要求。
可以发现若满足要求需要 $%d$ 相同且数字均不重复,且 $(max-min)/d-(r-l)$ 的数量。
直接线段树维护即可。
时间复杂度 $O(n\log n)$。