ARC072D Dam

题意:有个水库,最多能存 单位水,一开始是空的。

接下来 天,第 天早上有 单位的,水温为 的水流入水库。

每天晚上你可以放掉一些水,多少自定,但必须保证第二天水库不会溢出。

现在问,对于每个 ,在使用最优放水策略的情况下,第 天水库是满的情况下最高水温(每一问之间互相独立)。

,时限


总水温 各部分不同温度的水的 体积温度 的和除以总量

我们称 体积温度 为“热量”。由于体积 一定,我们只需要最大化热量。

表示第 天晚上,若水库内只能保留 升水,能获得的最大热量。

若将 视作函数 ,观察其性质。

若存在一组方案,容量为 ,热量为 ,则单纯的倒水可以得到 这个和原点相连的线段。

此外,水变多了热量不会变少。对于

于是,这个函数上的任意一点,向原点的连线下方不会有函数,水平向右发射的射线下方也不会有函数。不难发现,这必然是一个上凸壳

接下来,考虑凸壳 的转移,如图 :

转移无非两步,第一步强制加水,第二步任意倒水。第一步可以刻画为加一个向量,第二步则向原点连线并取

其中第二步需要找到移动后的凸壳上与原点相连斜率最大的点,然后将前面的线段去掉,并将该点和原点相连。

容易使用双端队列维护凸壳,队列中装的是向量,从左到右描述相邻两个顶点的差值。

  • 将凸壳 的部分去掉。

  • 将当前向量 放到队头。

  • 若队头的向量的斜率小于下一个向量,则将两者相加。这对应下面的过程。

    不难发现,这可以实现我们想要的效果。

(需要维护各项量的和,以便回答询问)

复杂度