2024.10.23总结
本文于 github 博客同步更新。
A:
场上唐了。
对于每个 \(n\),记录能够用 \(a\) 个 \(+\) 号与 \(b\) 个 \(\times\) 号组成 \(n\) 的这些 \((a, b)\) 对,如果某两个对 \(\left(a_{1}, b_{1}\right),\left(a_{2}, b_{2}\right)\) 满足 \(a_{1} \leq a_{2}\) 且 \(b_{1} \leq b_{2}\),那么无需记录 \(\left(a_{2}, b_{2}\right)\) 。
用倍增可以做出一个 \(\max (a, b) \leq 2 \log n\) 的构造,于是只需保留那些 \(\min (a, b) \leq2\log n\) 的 \((a, b)\) 对,共 \(\mathcal O(\log n)\) 个。
通过枚举最后一次运算是什么 (即枚举 \(n_{1}+n_{2}=n\) 或 \(n_{1} \times n_{2}=n\),并用 \(n_{1}, n_{2}\) 的 \((a, b)\) 对来更新 \(n\) 的 \((a, b)\) 对),可以在 \(\mathcal O\left(n^{2} \log ^{2} n\right)\) 时间内计算。
一个性质是,参与加法的 \(n_{1}\) 总是不超过 4 ,这样 \(\left(n_{1}, n_{2}\right)\) 的枚举量降至 \(\mathcal O(n \log n)\),总复杂度是 \(\mathcal O\left(n \log ^{3} n\right)\) 。
B:
直接拿大正方形算,不好做,将正方形分割为四个直角三角形和一个小正方形,横平竖直,比较好算。
判断正方形内是否存在点,可以用扫描线解决。
判断直角三角形内是否存在点,考虑将问题转化成 “\(x \leq x_{0}, y \leq y_{0}\) 构成的区域内,半平面 \(ax+by+c\leq0\) 内是否有点”。
解决上述问题的方法是,建立 \(x \leq x_{0}, y \leq y_{0}\) 构成的区域内的所有点构成的凸包,找到凸包上距离直线 \(ax+by+c=0\) 的有向距离最大的点,判断这个有向距离是否 \(\geq 0\) 即可。
用线段树处理 \(x \leq x_{0}, y \leq y_{0}\) 的限制,基于对点集与询问的半平面的预先排序,可以在 \(\mathcal O\left((n+q) \log ^{2}(n+q)\right)\) 的时间内对每个线段树结点建立凸包并计算出每个半平面所对的最远点。
C:
神秘