题解

cookiebus 2023-08-09 9:08:00 2023-08-09 9:09:08 2 返回题目

原题时间限制 600ms

momo_li: 这是我印象深刻的一个 trick。

首先考虑单组询问怎么做。

定义 表示已经考虑完了第一列宝石前 个,第二个宝石前 个,最大的总获利。

初始 则转移显然,枚举直接卖第一列、第二列,或者加工即可。

直接优化较难,数据较为复杂。考虑同时处理所有询问。

注意到,如果将状态 看做点,三种转移看成边,则整个转移网形成了一个图。并且,只存在如下三种边:

每组讯问等价于从 走到 的最长路。

注意到只能向右上走,考虑分治。

设我们正在处理的矩形长 ,宽 中较小者,将其切半。

对于完全被左矩形(上矩形)包含的询问,递归处理。

对于完全被右矩形(下矩形)包含的询问,递归处理。

对于横跨中间的询问,注意到最长路一定在某个纵(横)坐标穿过中心(即,从 走到 ,或从 走到 ,另一方向同理)。

考虑枚举这条边,对于这条边的左(下、左下)端点,处理出其到矩形左下角区域内所有点的最长路;对于这条边的右(上、右上)端点,处理出其到矩形右上角区域内所有点的最长路。

对于所有要处理的询问,若该边在询问矩形范围内,则依据已处理的最长路算出贡献。

若某一矩形内没有询问,则返回。

由于该图为 DAG,最长路仍可用 DP 解决,所以总时间复杂度为 ,可以通过。

{{ vote && vote.total.up }}