题解 | #Strange_Functions#

Strange_Functions

https://ac.nowcoder.com/acm/contest/24872/A

alt

题意是给出 nn 个奇怪的函数 f1(x),f2(x),,fn(x)f_1(x),f_2(x),\cdots,f_n(x),对每个函数 fi(x)f_i(x) 分别判断是否存在 xiRx_i \in \mathbb{R} 使得 fi(xi)f_i(x_i)f1(xi),f2(xi),,fn(xi)f_1(x_i),f_2(x_i),\cdots,f_n(x_i) 之中的严格最小值。数据范围是 n105n \le 10^51ki1051 \le k_i \le 10^5ai105\left| a_i \right| \le 10^5

分析 fi(x)f_i(x) 的性质,由于 arctan\arctan 函数在 R\mathbb{R} 上单调递增,且有 arctan(θ)=arctan(θ)<π2\left| \arctan(\theta) \right|=\arctan(\left| \theta \right|) < \frac{\pi}{2},那么只需要最小化 kisec(xai)\left| k_i\sec(x-a_i) \right|,取倒数之后就是最大化 cos(xai)ki\left|\frac{\cos(x-a_i)}{k_i} \right|,去掉绝对值之后就是最大化 cos(xai)ki\frac{\cos(x-a_i)}{k_i} 或其相反数。

注意到 cos(xai)ki=cos(x)cos(ai)+sin(x)sin(ai)ki=(cos(x),sin(x))(cos(ai)ki,sin(ai)ki)\frac{\cos(x-a_i)}{k_i} = \frac{\cos(x)\cos(a_i)+\sin(x)\sin(a_i)}{k_i}=(\cos(x),\sin(x))\cdot (\frac{\cos(a_i)}{k_i},\frac{\sin(a_i)}{k_i}),也就是要存在某个方向 (cos(x),sin(x))(\cos(x),\sin(x)) 使得 (cos(ai)ki,sin(ai)ki)(\frac{\cos(a_i)}{k_i},\frac{\sin(a_i)}{k_i}) 在这个方向上的投影最大,这意味着这个点要在所有 (cos(ai)ki,sin(ai)ki)(\frac{\cos(a_i)}{k_i},\frac{\sin(a_i)}{k_i})(cos(ai)ki,sin(ai)ki)(-\frac{\cos(a_i)}{k_i},-\frac{\sin(a_i)}{k_i})2n2n 个点构成的点集的凸包上。使用任意凸包算法求解这 2n2n 个点的凸包,所有凸包上的点对应的 ii 都存在 xix_i 使得 fi(xi)f_i(x_i) 是所有 f1(xi),f2(xi),,fn(xi)f_1(x_i),f_2(x_i),\cdots,f_n(x_i) 之中的严格最小值。

这里还有一个问题是如何选取浮点数比较的容错值 ϵ\epsilon,实测选取 ϵ=1030\epsilon = 10^{-30} 可以通过此题,但是如果在赛中去对各种 ϵ\epsilon 进行尝试,很容易产生大量罚时从而影响成绩。

参考代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=49719670

全部评论

相关推荐

威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
评论
9
收藏
分享
牛客网
牛客企业服务