CF833B The Bakery

(搬运与洛谷博客)。

套路,\(dp[i][j]\)表示前\(i\)个数被切成\(j\)段的最大值。

不同数个数可以用每个数最后出现的位置搞。

\(x\)最后出现的位置为\(lst_x\)

维护一个数组\(b\),只有所有\(lst_x\)的位置上是\(1\),其他都是\(0\)

再维护一个\(b\)的前缀和\(c\)

于是

\[dp[i][j]=\max_{k=0}^{i-1}dp[k][j-1]+c[i]-c[k] \]

然后把\(dp[i][j]-c[i]\)扔到线段树里。

但是\(c[i]\)会变!!

于是手膜几组\(b\),发现把\([lst_{a_i},i)\)的值减\(1\)就行了。

还有,开\(50\)棵线段树是不是不太好。。。

\(n\)只有\(35000\)啊,那没事了。

\(long\ long\)原来这么慢啊。

posted @ 2021-12-24 18:13  jimmyywang  阅读(88)  评论(0)    收藏  举报