昨天打了一场cf,b题一个模拟花了很长时间才做出来。所有直接就翻车了,通过最近的几次比赛,也暴露了很多的问题:好几次做题时,我的整体思路是没有错的,但总是因为漏掉了或没考虑到各种各样的小细节导致题目就是ac不了。这一点是我以后要注意加强的(不过如何加强这一方面的水平我还没想清楚)。
除此之外,我还想说说我最近做题的一个心得体会:有不少的题目都有一种类似的做题流程。第一步:想出其暴力做法(一个需要O(n)复杂度的题目,O(n2)的做法一般是比较好想的)。第二步:看看内层的循环完成的是什么操作,有没有哪里是可以进行优化的。最后将其优化到O(n)或者O(nlogn)。
举个简单的例子:C. Array Destruction这个题目内层循环需要完成的操作是:找出最大值 和 查找一个数是否在集合中,为了快速的完成这两个操作,我们可以用set来维护一个集合,这样就可以在O(logn)的复杂度内完成上面的两个操作,而总的复杂度也从O(n2)优化到了O(n)。
根据我最近做的cf题来看,这种题目非常的多,都是先想一个暴力做法,再对于其完成的操作进行优化。这种优化有时是用数据结构完成的,有时是基于贪心等算法,有时是基于操作本身的逻辑(比如:一个操作相比于前面的操作其实只是修改了相邻的一两个值)。
这样的题目还有很多:C. Longest Simple Cycle、C. Fence Painting、B. Hills And Valleys等等等等。