表现还是不错的。
D5A pilgrimage
最开始想用邻接矩阵乘法,后面发现不用。直接 dfs
就行了。
D5B history
一眼就看出是区间 dp。这次可以按套路来了:设 f [ l ] [ r ] f[l][r] f[l][r] 是 [ l , r ] [l,r] [l,r] 的答案,如果 s t r l = s t r r str_l=str_r strl=strr 那就是 f [ l + 1 ] [ r − 1 ] + 2 f[l+1][r-1]+2 f[l+1][r−1]+2,否则是 f [ l + 1 ] [ r ] f[l+1][r] f[l+1][r] 和 f [ l ] [ r − 1 ] f[l][r-1] f[l][r−1] 中取 min。
忘了加记忆化,变为和暴力同分。100 -> 20。
D5C destiny
挺有意思的一道题。
首先如果没有两个相同数字相邻,那就很好做。显然,可以把整个序列分成若干个单峰段。每次询问如果跨区间那就是 no,否则就是 yes。
但是可能会出现两个相同数字相邻。想了一会,发现可以把相同的数字段合并成一个数字,即缩段。然后开一个数组 at[i] 表示坐标点 i 在被缩段之后的下标。
一些简单的细节就不说了。
D5D freedom
写这道题时还剩 1h,打算打个 30 分做法的,结果居然没调出来。
设 f [ i ] [ j ] f[i][j] f[i][j] 表示前 i i i 位,最后一个数是 j j j 的方案数。直接转移是 O ( n 2 V ) O(n^2V) O(n2V) 的。
然后其实会发现那一维 j j j 可以省掉。因为哪种颜色都没有关系,只要不重复。推了下式子:有 k k k 个数让你填到 n n n 位里去(可重复),相邻两位数字不同,则方案数为 k × ( k − 1 ) n − 1 k \times (k-1)^{n-1} k×(k−1)n−1。
所以 dp 的时候就直接搞搞就好了。 O ( n 2 ) O(n^2) O(n2)。
看样子是有 O ( n ) O(n) O(n) 的做法拿 60 分?这个想不到。
如果把这些式子拆开继续推的话应该能推出一个类似于二项式的东西,然后就能 O ( log n ) O(\log n) O(logn) 了。只是数学水平堪忧,推不出来。
Conclusion
预估分 330,实际得分 220。主要问题在 B 题忘了记忆化。
事实上今天早上还打了 MarsOJ 的模拟赛。文件输入输出错了,丢了 90 分。
感觉在赛末 10 分钟就别写了(除非真的能写出来),返回去检查一下代码吧,多跑跑大样例。