2023.7.3 NOI模拟赛总结
1.时间安排
7:10~9:10
T1:数据范围非常小的最优化问题,限制很多可能是网络流。
T2:题意非常奇怪的最优化问题,而且运算过程还是实数,一眼看上去不会写暴力。
T3:只会暴力的数据结构,也许能树分块拿个根号的分?
先推T1,k=1 是简单枚举(埋下伏笔),k=2 可以在枚举 k=1 的基础上做一个规划,每个点可以选择往左或者往上,要求方向相同的必须形成连续段,最大化能被选中的点的点权和。
一开始觉得是网络流,但是一个点二选一加上前缀必须连续选择这些限制很难处理。
推了一会觉得是不是能直接DP,设 \(f_{l,r}\) 表示左侧自由空间是 \(l\), 上侧自由空间是 \(r\),枚举 \(k<l\) ,\(\geq k\) 的部分可以自由延伸,剩下的可以递归做子问题,上侧同理,感觉可以涵盖到所有的方案。
先不考虑复杂度写了个暴力,调了一些边界的细节过了大样例。
然后加上个记忆化和前缀和就可以做到单次询问 \(O(n^5)\) ,不过记忆化后转移边根本跑不满,效率大概是 \(O(n^4)\)。
9:00~9:30
把T3暴力写了。
一开始想的是把所有度数大于根号的点拿出来建虚树,然后在虚树上做DDP,但是我甚至连DDP要维护什么都不知道,摆。
9:30~12:00
不会写T2暴力,写了贪心样例一个都不对,寄。
给T1上了个状压的拍,没拍出来问题。
result:
T1:15 T2:/ T3:20
2.总结
T1:
写T1的 k=2 部分时意识到了没有处理到左侧或者上侧一个都不选的情况,这个到时加上了,但是忘记了 k=1 也没有考虑,对拍也没拍 k=1 的情况,毕竟是枚举的做法觉得不可能出问题(而且对拍的 k=1 的暴力也犯了同样的错误),把 k=1 改了个循环范围就过了。
对于细节特别多的DP题还是要写完后冷静下来再检查一遍所有情况是否都讨论了,最好把所有的情况都罗列出来一项一项检查,毕竟这种题暴力都有可能写错。
T2:
很神秘的DP题。
上午的一个瞬间的想法是枚举区间 \(l,r\) 作为最终的连通区间,但是不会处理区间外的水怎么流进区间内,而且也不会算区间内最优挖多少土,就放弃了这个思路。
实际上正解就是基于这个的,考虑区间外的水一定是把区间边界到每个水的路上的土挖成递增的,换句话说,区间左边是递减的,区间右边是递增的,这个可以 \(O(n)\) 简单预处理。
再考虑区间内怎么算,现在所有的水都汇聚到了这个区间,先考虑钦定的水位高度,那么把所有高于这个高度的土挖到和这个高度一样,接下来算出平均值,如果相等,那么这个水位高度就是最终的高度。
考虑如果不是,如果平均值大了,说明应该挖更多的土,水位应该更低,反之应该提高水位。
于是就可以根据单调性二分水位了,用前缀和优化可以做到 \(O(n^2logV)\)。
考虑实际上平均值关于水位是一个分段函数,并且分段点在于区间内 \(h\) 形成的集合,并且这个函数是个一次函数(感性理解),于是复杂度可以降到 \(O(n^2logn)\),确定出所在段后通过求出一次函数的表达式直接带入计算。
继续观察,设 \(f(l,r)\) 表示这个区间求出来的段(这里为了方便直接按值域划分为若干长度为1的段),发现 \(f(l,r)\geq f(l,r+1)\),所以双(三?)指针可以做到均摊 \(O(n^2)\),卡卡常就过了。
T3:
逆天题。
考虑把修改离线,对时间建线段树,那么每个叶节点相当于有若干个区间覆盖操作,非叶节点相当于把所有儿子按 max 合并后做若干个区间加,这个区间操作的数量是 \(O(n+m)\) 个的,于是就需要支持区间加,区间max,单点历史最小值,线段树合并即可。
思路确实只有这些,代码细节量爆炸(感性理解std写的是什么然后直接开贺)

浙公网安备 33010602011771号