• World Tour Finals 2019 D - Distinct Boxes 题解


    太神了,专门写一篇题解 qwq

    简要题意:给你 RR 个红球和 BB 个蓝球,你要把它们放到 KK 个箱子里,要求没有两个箱子完全相同(即两种球个数就相同),求 KK 的最大值。

    设第 ii 个箱子中有 xixi 个红球,yiyi 个蓝球,就变成了找平面上一个大小最大的点集 (xi,yi)(xi,yi),使 xi=R,yi=Bxi=R,yi=B。进一步,由于可以直接将 xx 最大的点 xx 坐标变大,yy 同理,因此只需有 xiR,yiBxiR,yiB 即可。

    这是一道二维平面上的题,我们可以想办法把它变成一维。给 xx 方向赋一个权重 ppyy 方向赋一个权重 qq,那么一个点 (x,y)(x,y) 就被投影到了 px+qypx+qy 上。此时我们发现所有点投影后的权重和为 pxi+qyi=pxi+qyipxi+qyi=pxi+qyi,于是当 xiR,yiBxiR,yiB 时,便有 pxi+qyipR+qBpxi+qyipR+qB。在某种程度上,我们就会希望 pxi+qyi 尽量小。

    首先当然二分 K,问题变为判定一个 K 是否可行。然后我们考虑一个凸包,凸包上的点 (X,Y) 代表 xi=X 时,yi 的最小值为 Y。感性理解一下这玩意大概就是凸的,并且对每个 X 都有定义。于是 K 可行当且仅当点 (R,B) 在凸包上方。又发现对于一个 (p,q),使 pxi+qyi 最小时,(xi,yi) 一定在凸包上,于是我们尝试用 (p,q) 搞出凸包上的一些点。

    继续发现 pxi+qyi=(p,q)(xi,yi),即向量 (xi,yi) 在向量 (p,q) 上的投影。pxi+qyi 最小,就是这个投影最小,可以看作拿一条与向量 (p,q) 垂直的直线去切这个凸包,所以每个点都一定有机会被切到,且 (p,q) 的斜率越大,切到的点越偏右。于是再对 (p,q) 的斜率进行二分,如果发现求出来的点 (xi,yi)(R,B) 左下方,那就成了;如果在 (R,B) 右上方,那就寄了;如果在左上方,那就增大斜率;如果在右下方,那就减小斜率。

    这里有两个技巧:1,不要在实数域上二分 (p,q) 的斜率,令 p+q=109+7(或其它常数),然后直接二分 p,可以发现这样基本上能覆盖到所有的斜率都能被弄到,从而能切到每个点。2,由于凸包上相邻两条线段斜率可能非常相近,因此我们要当发现当前凸包上一条连线在 (R,B) 下方时直接返回合法。

    最后的问题是如何计算对于一个 (p,q) 计算 pxi+qyi 的最小值。我们二分一个 z,求出 pxi+qyiz 的个数进行二分。然后求出 pxi+qyizx,y 分别的和以及多余的一些 pxi+qyi=z+1 的前若干个 x,y 的和。以上操作全部用类欧做就是一个 log,或者发现如果我们选了一个点 (x,y),那么它左下角的所有点都一定已经被选了,所以有 min(x,y)O(W13)W 为值域),二维分别枚举即可。

    一共三个二分,最后一步用类欧时间复杂度就 O(log4W),直接枚举复杂度就 O(W13log3W)

  • 相关阅读:
    【python操作Excel的方法】
    冥想第九百七十天
    python面向对象基础-封装
    [剑指 Offer]数组中出现次数超过一半的数字
    [Spring MVC6]事务管理与缓存机制
    基于Springboot的在线动漫信息平台
    Linux内存管理(十六):buddy系统分配器之慢速分配
    2022软件测试技能 Robotframework + SeleniumLibrary + Jenkins web关键字驱动自动化实战教程
    Qt 各种数据类型
    2023年9月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】
  • 原文地址:https://www.cnblogs.com/Charlie-Vinnie/p/16484614.html