Link
为什么这么简单的做法还是想不出来
Solution
先考虑暴力: 修改一个位置之后,从这个数字开始向后递推能否构成单调数列。每次是的,但是可以看出,做了很多无用功,因为每次转移的行为都是一样的,只要知道起点的值后面的值就都知道了。 考虑一下每个单调数列的来源,是的单调数列加上一个满足不降且最小的数字。修改了一个位置之后,不能知道对于它后面的某个数字,它所转移过来的那个位置还是不是合法,也就是说,不能知道的传递路径是否被阻断,也不能知道是否还有别的路径。 但是可以发现,对于一段整体的数列,开头的两个数字是否合法就直接决定了后面所有点是否合法,即知道了的起始点,就能固定的路径。 这样就可以看出子结构了,进一步想一下,发现可以用线段树维护。
Tips
根据暴力的无用功,寻找问题子结构,寻找合法的状态和转移,从而套数据结构维护。
Code
1 |
|