清华营模拟赛 5.12
赛时时间安排
读题8:00-8:20
对题目的第一感觉:
T1 启发式合并
T2 表面和善,实际非常复杂的计数
T3 又一道奇怪的字符串题
T1
今天几乎整个上午都用来肝T1了。
8:20-9:50 捋顺思路+码T1花了约一个小时,码完后才发现和第二个样例拍不上,之后确认自己理解错题意了,心态有点小崩
10:00-10:30 总算捋顺了题意
10:30-10:50 码完了暴力,终于答案对了
10:50-11:00 电脑怎么还是基本没网啊,只能换电脑交题
11:00-11:30 码完了启发式合并
11:30-11:45 调完了启发式合并
11:45-12:00 T2的10pts和T3的30pts都不是剩下的时间能打完的,无奈等掉分
赛后总结反思
1.这种题意费解的题一定要多手动模拟几组小数据再开码
2.T1最后赛场上码的基本上就是正解,和正解相差的地方除了一个给左移打标机的trick外,要格外注意的是如果要给一个函数传较大的东西进去(例如本题中的set)时,尽量加取地址符,否则传值会非常慢
3.T3其实是SAM中比较简单的一道题,但依然没有敏锐地察觉做法,SAM还是做得太少
T1
启发式合并,直接模拟题意,每个节点维护一个set,然后由size小的向size大的里面合并。
对于本题涉及的两种操作(求和,取MAX),对于求和,均摊下来是\(O(\log ^2 n)\)的,但一旦加上取MAX(相当于对一个set整体左移)的话,复杂度便得不到保证,因此不能直接左移,而改为维护左移次数的标机。
另外要注意上面提到的如果要给一个函数传较大的东西进去(例如本题中的set)时,尽量加取地址符,否则传值会非常慢。
T3
SAM的直接应用。
考虑每次向右/向左其实可以分别转化为跳到儿子节点/Parent tree节点上,因为每次向右/向左走后,一直继续走到儿子节点/Parent tree节点为止,一定是最优的(因为endpos集合的大小一直没有变化)。因此可以按照拓扑序分别向儿子节点/Parent tree节点累积贡献。