武外集训0308题解

TEST_145

首先离散化将值域降到 \(O(n)\)。对序列分块,处理每块内的询问。按从左到右顺序插入块右边的部分,对每个询问分别插入撤销块内的部分。按块内的值为边界,对值域分块。

每个值域块分别维护低 \(\log n\) 位(压位表示为整数)和后面的部分。

右边部分有进位的均摊,是 \(O(n)\) 的。

插入序列块内的值时,只能在值域块的最低位+1,因此在块大小超过 \(\log n\) 时,每个值域块的最低 \(\log n\) 个位只能向后进位至多一次,于是后面的部分只需维护前缀1的个数;而在块大小小于 \(\log n\) 时,块间有普通的进位均摊。

时间复杂度 \(O(n\sqrt m+m)\)

TEST_118

题意:长度 \(n\) 的序列,\(m\) 次操作:单点修改,查询区间内长度不超过 \(c\) 的子区间的最大的和。

我们先将序列按块大小 \(c\) 分块。

对于答案区间在块内的情况,块内的问题转化为,单点修改,查询区间内/全局的最大的子区间和,可以用线段树维护(区间的和、最大前缀和、最大后缀和、最大子区间和),块间用线段树维护区间内块内的答案,这部分是 \(O(n+m\log n)\) 的。

对于答案区间跨越了相邻两块的情况,可以对每个 相邻两块 分别维护,块间仍用线段树处理。问题转化为维护两个长度 \(c-1\) 的序列 \(a,b\)\(a\) 是前一个块的后 \(c-1\) 个数的后缀和,\(b\) 是后一个块的前 \(c-1\) 个数的前缀和),支持 \(a\) 前缀加,\(b\) 后缀加,给定 \(X,Y\) 查询满足 \(i\ge j,\;i\ge X,\;j\le Y\)\(a_i+b_j\) 的最大值;这可以拆分为 \(a,b\) 各取一个区间的最大值的和(线段树维护区间最大值),以及给定 \(L,R\) 查满足 \(L\le j\le i\le R\)\(a_i+b_j\) 的最大值(线段树维护区间内 \(a,b\) 分别的最大值,以及区间的答案)。这部分也是 \(O(n+m\log n)\) 的。

因此这题可以做到 \(O(n+m\log n)\) 的时间复杂度。空间 \(O(n+m)\)

TEST_86

题意是多次询问保留y区间,问每个连续段的小z的袜子的和。

构造一个新序列,序列分为若干段,每段对应原序列的一种颜色。一种颜色在原序列从左到右出现位置是 \(p_1,\dots,p_k\) ,则在新序列中对应的段有元素 \(k\) 个元素,第 \(i,\;(i=1,\dots,k-1)\) 个元素在查询的y区间包含原序列中 \(p_i\)\(p_{i+1}\) 中所有位置的y时被保留,第 \(k\) 个元素总是不被保留。查询的答案是新序列中,保留的每个连续段的小z的袜子的和(只有一种颜色,因此每段贡献是段长度的2次多项式)。

对新序列分块,块大小为 \(B\) ,每块对值域离散化后预处理 \(O(B^2)\) 种本质不同的询问的块内贡献,以及保留的极长前缀和极长后缀的长度,每次查询可以可以对新序列的 \(O(\frac nB)\) 块查询后顺序合并。

时间复杂度 \(O(n\sqrt m+m)\)

posted @ 2023-03-08 14:39  dddddadaplllllane  阅读(35)  评论(0)    收藏  举报