数据结构专题

例 $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)$。

 

 

posted @ 2020-08-12 21:42  siruiyang_sry  阅读(54)  评论(0编辑  收藏  举报