MOCK PTS 20220107 日志

……

简略题解

A – 小矩阵

高维莫队。如果认为 n,mn,m 同级,复杂度 O(n4q4+nq34)\newcommand\bigO[1]{\operatorname{O}\left(#1\right)}\bigO{n^4\sqrt[4]{q}+nq^{\frac{3}{4}}},实际上由于 qq 远小于理论块间移动次数,不能卡满,实测耗时比上式低一个数量级。

蒲韦坤说将询问 std::shuffle () 一下移动指针即可通过,速度与莫队相当。

B – 多边形

40 pts\text{40 pts} – 无禁用交点

我们发现,除开可能存在的直线 x=x0x=x_0,对于一条固定的直线,其与其他所有直线的交点中,能够出现在凸包上的只可能有两个:横坐标最大/最小的两个(纵坐标最大最小等价)。

考虑求取直线 li:y=kix+bil_i:y=k_ix+b_i 的上述两个点。观察到与直线 lj:y=kjx+bjl_j:y=k_jx+b_j 的交点横坐标为 bibjkjki\frac{b_i-b_j}{k_j-k_i},如果我们设点 Ai(ki,bi)A_i(k_i,b_i),这其实就是求取过 Ai,AjA_i,A_j 的直线的斜率的相反数。于是我们将 nn 条(或者 n1n-1 条)直线转化为相应的点,求出过它们中每一个的直线的最大/最小斜率(在左上/左下/右上/右下方,分别执行类似斜率优化般逐个将点插入凸包的算法)即可。

如果存在直线 x=x0x=x_0,我们暴力 O(n)\bigO{n} 求它与其他直线的交。最后将得到的 O(n)\bigO{n} 个点求二维凸包即是答案。

正解

由于禁用的交点极少(k50k\leq 50 个),故而我们将受到波及的至多 2k2k 条不同直线全部重新暴力求取与别的直线的交点,再取合法的最大/最小横坐标。复杂度 O(kn+nlogn)\bigO{kn+n\log n}

C – 大乱炖

没人讲也没人会,猜测与多项式与生成函数相关。

  • 2023年1月24日