这次的模拟赛我的发挥非常不好,有很多本来该拿的分都没拿到。

T1可以转化为将原序列分成若干个连续段,每个段的值是段内所有数的和,这些值组成一个新序列,要求新序列单调不减,求能分成的最大段数,并输出新序列。 我先写了一个O(n3)O(n^3)的dp,状态设计:dp[i][j]表示将前i个数分成j段,最后一段的最小我我也值。这个做法能拿70分。之后我一直尝试优化,但始终没摆脱二维状态的束缚,导致我最后没能通过这道题。 考后我看了看题解:设dp[i]表示前i个数在分成的段数最大的前提下最后一段的最小值,还要再开一个数组cnt[i]存前i个数能分成的最大段数。这样就能在O(n2)O(n^2)的时间内完成转移。这个解法在考场上没想出来实在太可惜了。

T2我先想了一个假的区间dp,只拿了第一档部分分。然后我写了暴力,但也写假了,一分没拿。接下来我又想了好几种做法,都不行。最终我也没能通过这道题。 考后我看了一下暴力代码,发现思路非常简单,而且跟我的思路类似,但我的思路有一些问题,导致会被卡。我听说有人用ST表做的,这个思路非常巧妙,说实话我真的不知道这个思路是怎么在考场上想出来的,太神奇了。还有用动态dp做的,这个也是真神了。

我写完T1T2以后只剩一个小时了。T3我打了一些部分分,但是bfs写错了(错因:v数组只记录了坐标,没记录到达每个点的方向),最后只拿了k=0的部分分。T4没时间看了。

这次模拟赛我考了倒数第一,这是一次警醒。下次我一定要调整好状态,放宽思路,争取拿到该拿的分数