上午在 xmoj 上打了场模拟赛
A
用时:20min
看到数据范围很小想到可以枚举不是回文串的串,然后判断后缀是否是回文串,如果是则加上前缀分为两个回文串的方案,显然是可以预处理的,判断回文串正反两边哈希即可。
但貌似出题人卡了自然溢出?想到的时候已经结束了。
总结:写哈希不要偷懒用自然溢出,最好能写双哈希,防止卡哈希出题人。
B
用时:10min
数学题,被薄纱了。
总结:要多加强数学。
C
用时:1h30min
首先离他最近点的可以直接多源 Bfs,卡了大概 30min 左右。
而确定顶点特别麻烦,至少需要 \(O(n^2)\),发现只要确定一行中两个点就能确定正三角形的顶点,双指针一下即可,快速统计和可以斜着做一遍前缀和,反斜做一遍即可。
总结:做题要有举一反三的能力,不要遇到这种换皮题就看不出来,对于这种数据范围不大的看似是数学的题,可以想一下不是数学的解法。
D
用时:30min
想着枚举往左做几步,右走几步,但中途可能超出 \(-n\) 或 \(n\),顺序可能影响答案,想到 DP,但有后效性,想起之前一道 AT 的套路把步数拿出来做属性,这样就没有后效性了。
考试时开了 5000 * 5000 的 long long 数组,成功的 MLE 了。
总结:写完代码看到一些比较大的数组要计算空间复杂度,例如 1e7 的数组,5000 * 5000 的二维数组,尤其是 long long 类型的。
Sleeping Schedule
用时:20min
简单 DP,设计状态 \(f_{i,j}\) 表示睡第 \(i\) 次觉在 \(j\) 开始,转移也很朴素。
Ezzat and Grid
用时:1h
反过来考虑,选择最多保留几个,相邻保留条件可以看成区间有交集。
然后类似 LIS 的状态设计,\(f_i\) 表示保留 \(i\) 前面最多保留几个,转移就是找到前面最大的 \(f_j\) 且 \(i,j\) 有交。
用一个线段树优化即可,而发现取值其实是单调递增的,区间取 max 可以变成区间覆盖。
总结:正难则反,很多题都可以这样思考,尤其是保留与去除,添加与删除。