[省选联考 2020 A/B 卷]冰火战士
〇、前言
看到题目列表剩下大概 30+ 题,感慨无限啊~~~
壹、题目描述
贰、思考&题解
考试的时候记得自己打了个三分,但是那个时候的自己居然不知道拥有平台的函数无法使用三分处理 这还是手调大样例的时候发现的。那个时候也太天真了吧......
我们最后要求的其实就是使得
最大的 \(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)\) 的所有信息.