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

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

设第 \(i\) 个箱子中有 \(x_i\) 个红球,\(y_i\) 个蓝球,就变成了找平面上一个大小最大的点集 \((x_i,y_i)\),使 \(\sum x_i =R, \sum y_i=B\)。进一步,由于可以直接将 \(x\) 最大的点 \(x\) 坐标变大,\(y\) 同理,因此只需有 \(\sum x_i \le R, \sum y_i \le B\) 即可。

这是一道二维平面上的题,我们可以想办法把它变成一维。给 \(x\) 方向赋一个权重 \(p\),\(y\) 方向赋一个权重 \(q\),那么一个点 \((x,y)\) 就被投影到了 \(px+qy\) 上。此时我们发现所有点投影后的权重和为 \(\sum px_i+qy_i=p\sum x_i+q\sum y_i\),于是当 \(\sum x_i \le R, \sum y_i \le B\) 时,便有 \(\sum px_i+qy_i\le pR+qB\)。在某种程度上,我们就会希望 \(\sum px_i+qy_i\) 尽量小。

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

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

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

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

一共三个二分,最后一步用类欧时间复杂度就 \(O(\log^4 W)\),直接枚举复杂度就 \(O(W^{1\over 3}\log^3 W)\)。

World Tour Finals 2019 D - Distinct Boxes 题解的更多相关文章

  1. Comet OJ 2019 夏季欢乐赛题解

    Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...

  2. ICPC World Finals 2019 题解

    [A]Azulejos 题意简述: 有两排瓷砖,每排都有 \(n\) 个,每个瓷砖有高度 \(h_i\) 和价格 \(p_i\) 两种属性. 你需要分别重新排列这两排瓷砖,使得同一排的瓷砖满足价格不降 ...

  3. ACM-ICPC World Finals 2019 G.First of Her Name

    题意:给一颗字典树,m次查询,每次给出一个字符串,问你该字符串是字典树上多少串的后缀 题解:字典树求广义sam,每次把查询串在sam上跑一遍,最后到达的点的sz就是答案,中途没法走了,就是没有出现过 ...

  4. 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解

    https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...

  5. CF293B Distinct Paths题解

    CF293B Distinct Paths 题意 给定一个\(n\times m\)的矩形色板,有kk种不同的颜料,有些格子已经填上了某种颜色,现在需要将其他格子也填上颜色,使得从左上角到右下角的任意 ...

  6. kick start 2019 round D T3题解

    ---恢复内容开始--- 题目大意:共有N个房子,每个房子都有各自的坐标X[i],占据每个房子需要一定花费C[i].现在需要选择K个房子作为仓库,1个房子作为商店(与题目不同,概念一样),由于仓库到房 ...

  7. kick start 2019 round D T2题解

    题目大意:由N个房子围成一个环,G个人分别顺时针/逆时针在房子上走,一共走M分钟,每分钟结束,每个人顺/逆时针走到相邻的房子.对于每个房子都会记录最后时刻到达的人(可能是一群人).最终输出每个人会被几 ...

  8. 2019.11.11&12题解

    Day1 考的不是很好,T1T2没区分度,T3想的太少,考试后期几乎都是在摸鱼,bitset乱搞也不敢打,只拿到了35分,跟前面的差距很大 A. 最大或 标签: 二进制+贪心 题解: 首先x,y中一定 ...

  9. 2019.11.12&13题解

    写在前面: 虽然拿到了rk1,但是T3被卡常TLE90分,(考后再交就A了!?),lemon80,又丢失了一次良好的AK机会, 掐头去尾距离联赛仅剩2天,最近中午一直睡不好,可能是有些紧张, 希望自己 ...

随机推荐

  1. 攻防世界web进阶题—unfinish

    攻防世界web进阶题-unfinish 1.看一下题目提示SQL 2.打开题目看一下源码,没有问题 3.查一下网站的组成:php+Apache/2.4.7+Ubuntu 4.扫一下目录,扫到一个注册页 ...

  2. p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞

    系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...

  3. spring boot rest controller 自定义反序列化 Date 格式

    @JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN) private Date time;

  4. WinUI3开发笔记(Ⅱ)

    WinUI3中的"MessageBox.Show()" # (一,如何实现) "开发WinUI3,第一个不适就是消息弹窗!" WinUI中没有C#.NetFra ...

  5. scanf("%d",a[i]+j)为什么不加取地址符号

    为什么我画的地方不加取地址符号? 不要在意标题为什么不加分号,因为长度太长了! 二维数组a[3][5]中,a[3]储存的是下一维的地址,a[1]等同于&a[1][0] 同理,a[1]+1等于& ...

  6. 如何定制.NET6.0的日志记录

    在本章中,也就是整个系列的第一部分将介绍如何定制日志记录.默认日志记录仅写入控制台或调试窗口,这在大多数情况下都很好,但有时需要写入到文件或数据库,或者,您可能希望扩展日志记录的其他信息.在这些情况下 ...

  7. 使用Go实现健壮的内存型缓存

    使用Go实现健壮的内存型缓存 本文介绍了缓存的常见使用场景.选型以及注意点,比较有价值. 译自:Implementing robust in-memory cache with Go 内存型缓存是一种 ...

  8. 从零开始实现lmax-Disruptor队列(一)RingBuffer与单生产者、单消费者工作原理解析

    1.lmax-Disruptor队列介绍 disruptor是英国著名的金融交易所lmax旗下技术团队开发的一款java实现的高性能内存队列框架 其发明disruptor的主要目的是为了改进传统的内存 ...

  9. pycharm相关介绍

    一.settings设置   1.搜font 设置字体 2.Keymap------快捷键 二.常用快捷键 1.Ctrl + Enter:在下方新建行但不移动光标: 2.Shift + Enter:在 ...

  10. Eclipse for C/C++ 开发环境部署保姆级教程

    Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...