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\)原来这么慢啊。

浙公网安备 33010602011771号