AtCoder Beginner Contest 343
\(\text{A~D}\) 略。
E - 7x7x7
想象一个 21 x 21 x 21 的盒子,这三个小正方体肯定被放在里面。
暴力枚举位置的话复杂度为 \(O(14^9)\) ,无法通过。
暴力统计的话又得 \(O(3 * 7^3)\) ,那总复杂度更爆炸了。
先考虑怎么优化统计答案吧,其实可以 \(O(1)\) 统计立方体的交,然后容斥容斥就能算出来三个结果了。
然后暴力枚举可以少枚举一个点,只要定一个正方体在盒子最中间就行了。
赛时这题 WA 爆了是因为把第一个正方体放在最左下角了,不能这么做的原因很简单。只要一个数据不存在任何一个点 \((x , y , z)\) 三个维度都是最大/小值就能卡掉。
F - Second Largest Query
出思路很快的一道题,但是代码不太好写。
单点修改,所以只用 Pushup 。
考虑 一段的次大值 一定是 左右段的最大值和次大值 这四个数字中的任意一个。
那么维护 maxx/smaxx/mnum/snum ,分别表示该段的 最大值/次大值/最大值出现次数/次大值出现次数。
Pushup 的时候开个大小为 4 的 vector 排序并 unique,就能找到前两大的数了,然后出现次数就是两边等于这个数的个数加起来,这题就写完了。
G - Compress Strings
很板板的 状压dp,记录单个串长度的数量级为 \(L\) 。
第一反应是想到了这题:P1019 [NOIP2000 提高组] 单词接龙 。
然后题目就自然转化成了:如果对于一个串 \(ch_i\) 和另一个串 \(ch_j\) ,不存在一个 \(k\) 使 \(ch_i\) 的后 \(k\) 个等于 \(ch_j\) 的前 \(k\) 个,那想满足题意就必须把两个串接起来。
否则找到这个最大的 \(k\) ,并且通过共享这 \(k\) 个字母的方式接起来。
那么我们用 \(O(n^2L)\) 预处理 \(zy_{i , j}\) 代表把 \(ch_j\) 串到 \(ch_i\) 后面贡献的最小长度。
转移方程就是:从小到大枚举集合 \(i\) ,位置 \(j\) 和位置 \(k\) 。写出 \(dp_{j,i} = min(dp_{j,i} , dp_{k,i\ \text{xor}\ (1 << (j - 1))} + zy_{k,j})\) 。
写完了测一发样例发现过不了,很快发现要特判一种情况:
一个字符串被另一个字符串完全包含,那这个字符串就属于无效的。
这个特判一手就完事了,然后特判完发现过不了另一组样例了???
然后发现两个字符串一模一样的话肯定得保留至少一个,那么把上面完全包含的条件加上不能完全相同就行了。
总时间复杂度为 \(O(n^2L)\)

浙公网安备 33010602011771号