2023.6.16 NOI模拟赛总结
1.时间安排
7:10~8:30
T1:树上计数,看数据范围是 \(n^3\) 级别感觉不像是考子树合并 \(O(n^2)\) 结论的,可以大概推出来一个由父亲和兄弟合并的背包。
T2:神秘题,模拟两个周期运动的端点,左边的如果超过右边不能动,感觉像数学题,毕竟1e6数据范围不太像数据结构题。
T3:最优化DP,既然是三元组不是 \(k\) 元组肯定设计状态把其中两个放进下标,编了个 \(n^4\) 感觉很对,能有50分可还行。
直接推方案感觉很复杂,求总方案数是简单的,直接dfs乘一乘就出来了,考虑转概率算期望,因为根1的DP状态一定是 \(f_{1,1}=1\),而且优势在于合并兄弟时不需要考虑兄弟排在自己前面时兄弟子树内的方案,最后拿概率乘方案就行了。
简单推一下就很自然写出来了 \(n^4\) 的DP,每次把兄弟节点做一个背包,用 \(g_{i,j}\) 来表示用了 \(i\) 个兄弟子树大小和是 \(j\) 的概率,转移需要乘关于 \(i\) 的系数。
这时候才意识到 \(n^3\) 级别的数据范围是需要上可撤销背包,但是我的背包带系数,稍微想了一下把系数拆在统计答案里面就是个简单的01背包了,01背包的撤销只需要倒着执行DP的过程。
能过大样例,计数题感觉过大样例就不需要对拍了,就不管了。
8:30~10:00
先把T3的 \(n^4\) DP写了,居然不对,答案小了,仔细想了一下,发现多算的是一开始没选任何三元组时不需要支付不选的代价,感觉很难正着DP。
既然不能正着就倒着DP,稍微改了一下轻松过 \(n=100\) 的大样例,复杂度是 \(O(n^4)\)。
联想到以前考过一个四种颜色染色的题就是记录下标,那题用了少记录一维下标多记录一个颜色与下标的映射函数的方式优化状态数和转移,同样能运用到这题,改了一下就是 \(O(n^3)\),\(n=1000\) 的大样例正确性没有问题。
继续观察数据范围,一个部分分时 \(w\) 只有100,这启发不学习的空档期不会太长,否则我这一天可以压根就不学习,反正将来贡献也会消失掉(题目背景意味深),那么把下标控制在一个比较合理的范围内,考虑题目空档期的额外贡献是一个等差数列求和,那么就把这个范围设置为 \(O(\sqrt w)\) 级别。
试了一下,大样例不对,很疑惑。
想了很久才意识到直接从末尾的转移是要特殊处理的,加上就对了,复杂度大概是 \(O(n(\sqrt{w})^2)=O(nw)\) 的。
10:00~12:00
打了T2的暴力模拟和特殊性质两个端点循环周期相等,根据特殊性质猜测了一个性质是整体循环周期是两个循环周期的最小公倍数,为了保险起见改成了两个循环周期的乘积,能过大样例,没拍(伏笔)。
实在是想不明白这个过程有啥东西能快速维护,摆。
result:
T1:100 T2:50 T3:0(多测没清空数组)
2.总结
T2:
首先要推一个转化,右端点最终的位置只与时间有关,不受左端点影响,最终时刻的位置是容易求的,所以考虑求出最终时刻的右端点位置和右端点与左端点的距离,相减就是答案。
考虑构造一个以时间为下标的序列 \(t\),\(t\) 的取值取决于此时两个端点的运动状态,相同为0,不同时左端点移动为-1,右端点移动为1。
然后猜一个结论,\(x\) 时刻两端点距离等于序列前 \(x\) 项的和减去前 \(x\) 项内最小的前缀和,证明是简单的,只需要考虑从什么时刻起左端点的移动不受右端点影响。
然后 \(t\) 序列有循环节,就是两个端点循环周期的最小公倍数,显然有这个性质。
再考虑一个性质,如果把 \(t\) 序列相同的段缩成一个,总个数是 \(O(n)\) 级别的,证明也是显然。
于是暴力求出来用上面方法表示的 \(t\) 序列,查询的时候二分一下对循环节取模后的位置在 \(t\) 序列的哪里,其他计算都是 \(O(1)\) 的,复杂度 \(O(V+nlogV)\)。
总结一下,这题就是个逆天的推性质题,看起来每个结论都显然,但是每个结论都想不到想到了也不会证。
T3:
加上多测清空数组就过了,我不好说。
多测题本地对拍数据生成器一定要生成多组数据!不要嫌麻烦
被多测坑无数次了,麻

浙公网安备 33010602011771号