[BZOJ十连测]线段树

一、题目

在这里插入图片描述

二、解法

在若干次操作后,某一个位置的值可以表示成若干各区间的最大值。

例如位置 k k ,我们找到当前操作前最后一个(编号最大但小于当前编号)覆盖当前区间左端点的操作的左端点,最后一个覆盖当前当前区间右端点的操作的右端点,把这个左右端点当成一个新的操作区间,然后重复执行上述操作。

也就是我们需要一直向左找,一直向右找,找到最左的和最右的 l l , r r ll,rr k k 位置上面的即是 [ l l , r r ] [ll,rr] 这个区间中的最大值。

我们可以把上述操作建成图,分别建成左树和右树,把操作区间当作节点,左树的父节点即为最后覆盖当前操作区间左端点的操作区间,右树同理,我们可以在这颗树上倍增,就可以快速找到 l l ll r r rr

具体来说,我们按顺序扫描操作区间,维护一颗线段树,区间修改,单点查询即可。

建出这两棵树之后,查询和修改就不成问题了,用线段树维护区间最小值,查询即可,时间复杂度 O ( n log n ) O(n\log n)

咕咕咕
发布了217 篇原创文章 · 获赞 12 · 访问量 5146

猜你喜欢

转载自blog.csdn.net/C202044zxy/article/details/104075590