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\) 为左看的序列):
转移后,对于每个最大值的位置 \(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)\) 。

浙公网安备 33010602011771号