[省选联考 2020 A/B 卷]冰火战士

〇、前言

看到题目列表剩下大概 30+ 题,感慨无限啊~~~

壹、题目描述

传送门 to LUOGU

贰、思考&题解

考试的时候记得自己打了个三分,但是那个时候的自己居然不知道拥有平台的函数无法使用三分处理 这还是手调大样例的时候发现的。那个时候也太天真了吧......

我们最后要求的其实就是使得

\[\min\left\{\sum_{k=1}^{S_i}[I_k\le x]I_k,\sum_{k=1}^{S_f}[x\le F_k]\right\} \]

最大的 \(x\).

看上去赶脚有单调性,但是细细思考一下,这个函数存在平台,所以诸如三分之类的方法就搁浅了。

从另一方面思考,当温度升高,冰战士的能量逐渐增高,而火战士则降低,我们最后相当于要求最充分的抵消能量的情况,设 \(I(x)\) 为冰战士在 \(x\) 下的战力,而 \(F(x)\) 为火战士在 \(x\) 下的战力,显然 \(I(x)\) 不降,\(F(x)\) 不升,而 “最充分的抵消能量的情况” 相当于 \(F(x),I(x)\) 的交点,这个东西用二分可求,具体地,我们只需求出两个点:

  • 满足 \(I(x)\le F(x)\) 的最大的 \(x\)
  • 满足 \(I(x)\ge F(x)\) 的最小的 \(x\)

取两者中的较小的函数值即可,复杂度 \(\mathcal O(n\log^2 n)\),另一个 \(\log\) 来源于使用树状数组(或其他数据结构)维护战士的集合,听说考场上这个做法居然可以拿满? 这真的是 CCF ?

但是还有优化的空间,因为这里有一种算法,将树状数组和二分结合起来,但总复杂度有 \(\mathcal O(\log^2 n)\) 降为 \(\mathcal O(\log n)\).

考虑树上倍增求 \(LCA\) 的方法,我们从 \(u,v\) 的第 \(2^{\log n}\) 个祖先开始从大往小考虑,如果可以跳就跳,如果不行,则考虑第 \(2^{\log n-1}\) 个祖先,依次往下。

此处也是一样,如果我们要求 \(I(x)\le F(x)\)\(x\),那么我们就考虑 \(cur+2^i\) 的位置是否满足,如果不满足,则考虑 \(cur+2^{i-1}...\) 直至满足条件,然后继续此过程,总复杂度降为 \(\mathcal O(n\log n)\).

叁、参考代码

\(\color{red}{\text{Talk is BIT, but I have no code.}}\)


肆、用到の小 \(\tt trick\)

实际上使用到的是 \(\tt BIT\) 的性质:对于树状数组的 \(c_i\),实际上保存的是 \([i,i+\text{lowbit}_i)\) 的所有信息.

posted @ 2021-03-25 15:22  Arextre  阅读(80)  评论(0编辑  收藏  举报