BIT training short round #2 summary
BIT 校赛 2.5h场第二场总结
- solved 5/6 , rk 5
又是送罚时的一天(8发)
历程
最开始在 C 卡住,边上点的处理一直写不对(哎哎 corner case 咋这么难写),还送了 2 发,挂样例也要算罚时,哭。
D 偷懒写的 \(Q\log^2n\) 被卡了。
E 写 ull 哈希又被卡了,再也不写 unsigned 哈希了。 😦
部分题解
C - Missile Silos
主要说一下边上点的处理,设 \(d_u\) 为最短路,一条边 \((u,v)\) 下,设 \(l_u\) 为距离 \(u\) 多少距离的边上的点使得从 \(u\) 和从 \(v\) 到这个点的最短路一样,就是求这条边的重心。得到 \(l_u=\frac{d_v-d_u+w}{2}\) ,加上 \(d_u\) 得到起点到这个点的最短路 \(\frac{d_v+d_u+w}{2}\) ,那么从 \(u\) 到 \(v\) ,最短路经历 \(d_u-\frac{d_v+d_u+w}{2}-d_v\) 的过程,判断一下就行。
E - String Compression
一个字符串的最优拆分是选最小循环节,因为数字位数的增长很慢。
通过求出字符串 \(s_{1 \cdots n}\) 的 \(next\) 数组,该字符串的最小候选的循环节长度为 \(n-next_n\) ,若 \(n\) 不能整除这个值则该字符串没有循环节。
也可以哈希枚举循环节长度暴力判断,复杂度是调和求和,多一个 \(\log\) 。
求出所有子串的最小循环节,线性 DP 即可,复杂度 \(O(n^2)\) 。
小教训:不要用 unsigned 哈希,会变得不幸。
F - Bear and Company
最开始想的区间 DP,但写不出来 QAQ 。
把不属于 \(V,K\) 的字符统一设成 \(X\) 。
我们考虑线性的把目标序列排好,设 \(f_{v,k,x,0/1/2}\) 表示把原字符串前 \(v\) 个字符 \(V\),前 \(k\) 个字符 \(K\) ,前 \(x\) 个字符 \(X\) 全部向前移动到前 \(v+k+x\) 个位置上组成合法串,且最后一个字符是 \(v/k/x\) 的最小代价(其他的字符都不做操作)。
转移的时候,考虑多选一个字符,以选 \(V\) 为例子,把它放到后一个位置,即第 \(v+k+x+1\) 个位置,移动的次数就是前 \(pos\) 个位置中有多少个字符不在当前状态排序的字符内,\(pos\) 是第 \(v+1\) 个字符 \(V\) 的位置,这个可以预处理出来。注意 \(K\) 不能移到 \(V\) 后面,由第四维状态限制。
为什么要这么转移,我们遇到 \(VK\) 串时,直接交换 \(VK\) 不一定是最优的转移,样例 \(VVKEVKK\) 就是个例子,我们交换 \(EK\) 是更优的,体现在状态里就是把前 \(2\) 个 \(V\) 和前 \(1\) 个 \(X(E)\) 排好的最优代价。
总复杂度 \(O(n^3)\)。

浙公网安备 33010602011771号