[CSP-S 2024] 染色
CCF在CSP卡常我是没想到的
一眼DP,尝试设\(f_i\)表示前\(i\)个的最大价值,假设在\(i\)前面第一个涂与\(i\)相同颜色的方块是\(j\),就会发现\([j+1,i-1]\)的价值没办法确定,主要是\(j+1\)的价值没办法确定。此时的情形是\(j\)和\(j+1\)的颜色不同,于是可以加维设\(f[i][0/1]\)表示前\(i\)个的最大价值,其中\(i\)和\(i-1\)的颜色相同/不同,于是有
\[f[i][0]=\max(f[i-1][0],f[i-1][1])+\begin{cases}
0 & \text{if } a[i]≠a[i-1] \\
a[i] & \text{if } a[i]=a[i-1]
\end{cases}\]
\[f[i][1]=\underset{j<i-1}{\max}(f[j+1][1]+\text{val}(j+2,i-1)+\begin{cases}
0 & \text{if } a[i]≠a[j] \\
a[i] & \text{if } a[i]=a[j]
\end{cases})\]
,其中\(\text{val}(i,j)\)表示\([i-1,j]\)是相同颜色,\([i,j]\)的总贡献.这个用前缀和处理就好了,即\(\text{val}(i,j)=sum_j-sum_{i-1}\),于是有
\[f[i][1]=\underset{j<i-1}{\max}(f[j+1][1]-sum_{j+1}+\begin{cases}
0 & \text{if } a[i]≠a[j] \\
a[i] & \text{if } a[i]=a[j]
\end{cases})+sum_{i-1}\]
对于这个式子,不难以\(a[i]\)为下标建立线段树找最大值,然后实现\(O(Tn\log V)\)的复杂度
可惜,CCF这次卡常,而且我优化不掉,于是只能使用其他技巧
想一下,我们现在要干的事是找出\([1,a[i]-1]\)和\([a[i]+1,V]\)中的最大值,以及\(a[i]\)的DP值加上\(a[i]\).如果我们直接找\([1,V]\)的最大值,那么显然那可以\(O(1)\)时间,但是如果找出来的地方是\(a[i]\)呢?其实不影响,因为此时一定有\(f[j+1][1]-sum_{j+1}+a[i]>f[j+1][1]-sum_{j+1}\)
这个优化以前没见过,的确可以看一下