模拟测试75
来填坑了......
T1:
将$A$和$B$看成变量,那么题意转化为是否存在$A$和$B$,使得$\frac{A}{a_i}+\frac{B}{b_i}$最小。
解不等式$\frac{A}{a_i}+\frac{B}{b_i}<\frac{A}{a_j}+\frac{B}{b_j}$得:
$\frac{A}{B}<\frac{a_ia_j(b_i-b_j)}{b_ib_j(a_j-a_i)}$。
不难看出只与$A$和$B$的比值有关。
将$(\frac{1}{a_i},\frac{1}{b_i})$抽象成平面上的点,则$\frac{A}{a_i}+\frac{B}{b_i}=z$可以看成一条直线。
钥匙$z$尽可能小,就要维护一个左下凸包。
吧$a$和$b$数组排序,用单调栈储存凸包上的点。
时间复杂度$O(nlogn)$。
T2:
可以把每个化学物质的键能作为未知量代入,但是有特殊情况,即可以在不知道所有未知量的具体数值的基础上求得的答案。
发现最终答案只与给定方程的焓变有关,将每个方程所占的百分比看成未知量,拼出最后方程即可。
时间复杂度$O(n^3)$。
T3:
撞车次数随时间单调不减没,于是可以二分时间。
将每个人此时的位置算出,由于每个人都从静止开始做匀加速运动,所以不相撞的条件为相对位置不发生改变。
将所有人按初始位置排序,问题转化为求最长上升子序列。
考虑如何求字典序最小的方案。
LIS的转移为树形结构,动态维护已经建立出来的树,发现字典需大小取决于lca以下,树上倍增维护最小值进行比较即可。
时间复杂度$O(nlogn)$。