P2943 Cleaning Up G 题解
P2943 Cleaning Up G
题目链接。
Solution
记 \(f(i)\) 为前 \(i\) 头牛的最小代价,显然有
\[ f(i)=\min_{j=1}^i\{ f(j-1)+w(j,i) \}
\]
\(w(l,r)\) 为 \([l,r]\) 中颜色数的平方,也就是
\[ w(l,r)=\left( \sum_{i=l}^r[suf(i)>r] \right)^2
\]
边界:\(f(0)=0,f(i)=\inf\)
显然是 \(O(n^2)\) 的
试图找决策单调性规律无果
发现答案不超过 \(n\),因为可以每个人单独一段
此时若一段颜色数超过了 \(\sqrt n\) 就剪枝掉了
于是就可以 \(O(n\sqrt n\log n)\) 了
如何去掉 \(\log\)?
我们需要预处理出 \(g(i,j)\) 表示最左的位置 \(pos\) 使得 \([pos..i]\) 中的颜色数 \(=j\).
发现它有很多单调性啊,这里举两个例子:
根据颜色数的式子,观察出 \(g(i,j)\le g(i-1,j-1)\)
于是转化为 \(O(n)\) 条斜线,每条线的决策点单调递减
一条条线地计算,每次计算都开一个 \(suf\) 的桶即可,是 \(O(n\sqrt n)\) 的
另一种思路是:
发现 \(g(i,j)\) 随着 \(i\) 的增加,单调不降
于是维护一个指针、一个桶即可
题目还行,数据有点水...