Educational Codeforces Round 182 部分题解

edu 182 题解

D.Price Tags

考虑枚举 \(x\),则最大的最终价格不超过 \(\lceil\frac{M}{x}\rceil\)\(M\) 是序列最大值。

我们再依次枚举每个价格出现多少次,最终能改到当前价值的原价值是一段区间内的数,是方便统计的。

根据调和求和,复杂度为 \(O(TM\log M)\) ,比较卡。

E.Looking at Towers

可以发现左看右看最终的数一定是序列最大值,我们可以利用最大值将左右完全分开。这里不妨一个方案下,以取到最大值的位置的最右端 \(x\) 为分割点,\(1,2,\cdots,x\) 分配给左看(就是最大值全分配给左看序列),\(x+1,\cdots,m\) 分配给右看(也就是右看序列不分配到最大值)。

考虑 E1 的做法,以左看为例子,dp 为 \(f_{i,j}\) 表示当前前 \(i\) 个数已经配对了左看序列的前 \(j\) 个数,第 \(i\) 个数一定选了的方案数,再设 \(g_{i,j}\) 为关于 \(i\) 的前缀和,即第 \(i\) 个数不强制选的方案数,转移为(设 \(s_m\) 为左看的序列):

\[\begin{align*} f_{i,j}&\leftarrow g_{i-1,j} &\quad a_i\leq s_j\\ f_{i,j}&\leftarrow g_{i-1,j-1}&\quad a_i=s_j\\ g_{i,j}&\leftarrow f_{i,j} \end{align*}\]

转移后,对于每个最大值的位置 \(x\) 都有 \(f_{x,m}\times g_{x,m-1}\) 的贡献。

考虑用线段树维护 \(g_{j}\) ,每次转移时,对于 \(a_i\leq s_j\)\(f_{i,j}\) 换掉,等价于对于一个后缀,\(g_{j}\) 后缀乘 \(2\),对于 \(a_i=s_j\) ,是一个单点加。

最后求左看是求 \(f\) ,差分一下就可以了。

于是上述转移可以用线段树优化,复杂度 \(O(n\log n)\)

F.Bracket Groups

结论是,答案不超过 \(2\)

若存在串 \(()\) ,则一定不可行,否则一定可行。

现在不存在串 \(()\) ,先考虑 \(2\) 组的情况,我们构造 \(()()()\cdots\)\((((((\cdots)))))\) 这两种串,若一个字符串存在 相邻 两个位置一样,则放入第一个组,否则放入第二个组。可以发现这样分配一定是不会冲突。

现在考虑 \(1\) 组是否可行,子串配对想到 acam ,对所有串构建 acam,一个构造字符串可行当且仅当其沿着 acam 走,不会落到任意一个结束位置在 fail 树的子树内,而至于后者哪些点不能落到,可以在构造时直接求出来。

那么可以 dp,设 \(f_{i,j,x}\) 表示当前填了 \(i\) 个括号,括号前缀和为 \(j(j \geq 0)\) ,当前在结点 \(x\) 处是否可行,最后再构造方案就可以了。

这里因为可行的终点比较多,我们也可以倒着加括号,最后终点只有 \(f_{0,0,0}\) 这个位置,构造起来也更方便。

复杂度 \(O(n^4)\)

代码

posted @ 2025-09-16 14:07  蒻蒻虫  阅读(122)  评论(0)    收藏  举报