CF1861D

发布时间 2023-11-02 21:57:54作者: lalaouye

废话:

VP 时 T3 思路不清晰,写了很久,然后这题没时间做了,赛后五分钟 AC 了(还好不是正赛,不然我会气死的)。

所以做题前思路一定要清晰且严谨!

思路:

观察这个问题,发现如果 \(l\)\(r\) 不是单调的,那么完全没必要一起乘。

那么本题中的操作将会一整段一整段的进行,我们肯定会让段数尽可能小,于是就可以 dp 了。

\(f_{i,0/1}\) 表示当前这一段上升/下降段数的最小数量,因为我们并不需要特别关注段之间的大小关系(因为可以自己调整相对关系嘛,但是是有细节的,具体后面会讲),所以转移是简单的,需要分三种情况讨论,具体如下:

1.当 \(a_i=a_i-1\) 时,无论如何 \(i\)\(i-1\) 都不可能分在一段,所以

\[f_{i,0}=\min(f_{i-1,0},f_{i-1,1})+1 \]

\[f_{i,1}=f_{i-1,1}+1 \]

为什么 \(f_{i-1,0}\) 不能转移到 \(f_{i,1}\)?因为前面并没有将数变成负数,但是当前这一段变成了负数,那不就不能单调递增了吗?所以所有的 \(f_{i,1}\) 都不能由 \(f_{i-1,0}\) 转移。

2.当 \(a_i<a_{i-1}\)

\[f_{i,0}=\min(f_{i-1,0},f_{i-1,1})+1 \]

\[f_{i,1}=f_{i-1,1} \]

应该不难理解,当 \(a_i>a_{i-1}\) 时同理,那答案是什么呢?

我们发现如果 \(n\) 处于一个单调递增的段时,这个段是没必要乘的,所以答案要减 \(1\),但是当 \(n\) 处于一个单调递减的段时,显然必须要乘,所以不能减,那么最终答案等于 \(\min(f_{n,0}-1,f_{n,1})\)

code