题意是给出 n 个奇怪的函数 f1(x),f2(x),⋯,fn(x),对每个函数 fi(x) 分别判断是否存在 xi∈R 使得 fi(xi) 是 f1(xi),f2(xi),⋯,fn(xi) 之中的严格最小值。数据范围是 n≤105,1≤ki≤105,∣ai∣≤105。
分析 fi(x) 的性质,由于 arctan 函数在 R 上单调递增,且有 ∣arctan(θ)∣=arctan(∣θ∣)<2π,那么只需要最小化 ∣kisec(x−ai)∣,取倒数之后就是最大化 ∣∣∣kicos(x−ai)∣∣∣,去掉绝对值之后就是最大化 kicos(x−ai) 或其相反数。
注意到 kicos(x−ai)=kicos(x)cos(ai)+sin(x)sin(ai)=(cos(x),sin(x))⋅(kicos(ai),kisin(ai)),也就是要存在某个方向 (cos(x),sin(x)) 使得 (kicos(ai),kisin(ai)) 在这个方向上的投影最大,这意味着这个点要在所有 (kicos(ai),kisin(ai)) 和 (−kicos(ai),−kisin(ai)) 这 2n 个点构成的点集的凸包上。使用任意凸包算法求解这 2n 个点的凸包,所有凸包上的点对应的 i 都存在 xi 使得 fi(xi) 是所有 f1(xi),f2(xi),⋯,fn(xi) 之中的严格最小值。
这里还有一个问题是如何选取浮点数比较的容错值 ϵ,实测选取 ϵ=10−30 可以通过此题,但是如果在赛中去对各种 ϵ 进行尝试,很容易产生大量罚时从而影响成绩。
参考代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=49719670