CF1842
比两边和的大小即可。
显然如果一个数拥有的所有二进制位的 \(1\) 被包含在 \(x\) 中,选了一定不会导致不能变成 \(x\);如果有一个 \(1\),\(x\) 对应的位上是 \(0\),则一定不能选。
因此从三个栈上面看,只要所有 \(1\) 对应到 \(x\) 上也是 \(1\),就选;否则这个栈再也不能选了。
考虑所有删除的区间。任意两个删除的区间显然不可能相交,因为删了一个之后,另一个的左(右)端点就会被一起删掉;而如果两个区间相包含,和只删大的区间效果相同。
因此,问题抽象为:找出若干个不相交区间(两端的颜色相同的球构成一个区间),使得这些区间的长度和最大。
参考:饥饿的奶牛
定义 \(dp_i\) 为前 \(i\) 个球的最少留下几个。\(dp_i=min(dp_{i-1} + 1,min\{dp_j|a_{j+1}=a_i,j+1<i\})\)。
可以边更新边存下来 \(1\sim i-1\) 的颜色为 \(clr\) 的所有位置 \(v[clr]\)。求 \(dp_i\) 的时候可以遍历 \(v[a[i]]\) 求。
在坐标系里给出一条直线 \(x+y=k\),给出 \(n\) 个在第一象限且在 \(x+y=k\) 严格下方的点,有两种操作:
-
选一个等腰直角三角形,斜边在 \(x+y=k\) 上,删除三角形内所有点。设这个三角形边长为 \(l\),花费为 \(A\cdot l\)。(\(A\) 是给定的常数)
-
选一个点删掉,花费 \(c_i\)。
求把所有点删掉的最小花费。