一些(构造)题
不会写标题了((
Y-Shaped Knife
(from Petrozavodsk Winter 2020. Day 4. Yandex Cup 2020. A)
假设我们固定了 Y 形的角度为:一定有一条平行于 \(y\) 轴的竖线。
假设从左到右枚举了竖线的 \(x\) 坐标,把所有点按照 Y 形剩下两条斜线的角度投影到竖线上。(可以先把所有点随机旋转一个角度来避免投影后坐标重合。)
在竖线上找到上 \(\frac{2}{3} n\) 与下 \(\frac{1}{3} n\) 的分界点,则要求上 \(\frac{2}{3} n\) 恰好有 \(\frac{1}{3} n\) 个来自左边/右边。
可以发现,随着 \(x\) 从 \(-\infty\) 变大到 \(\infty\),左边的点数从 \(0\) 逐渐变大到 \(\frac{2}{3} n\),于是可以二分一个合法的 \(x\)。
Anti-stress
(from Petrozavodsk Winter 2022. Day 5. Yandex Cup. F)
考虑画一个十字形,把第 \(1,3\) 象限和第 \(2,4\) 象限分别匹配,红点是 \((0,0)\),如果蓝点和黄点的数量匹配就匹配成功。
如果确定了十字形的角度,那么两条分割线的位置是确定的(必须把点分成两半),因此可以 check 一个角度是不是可行的。
这样分点之后,第一象限点数 = 第三象限点数,第二象限点数 = 第四象限点数。
设差值 \(c\) 为 第一象限蓝点数 - 第三象限黄点数。则 \(-c\) 为 第二象限蓝点数 - 第四象限黄点数。
若 \(c=0\) 则找到了能匹配成功的角度。
考虑角度从 \(\alpha = 0\) 转到 \(\alpha = \frac{\pi}{2}\),那差值会从 \(c\) 变到 \(-c\),并且在转动过程中每次只会 \(\pm 1\),一定有一个角度差值为 \(0\)。
二分求这个角度即可。具体的,假设 \(c_l > 0, c_r < 0\),我们求出 \(c_{mid}\),不断取 \(c_l \times c_r < 0\) 的区间。
算 \(c_{\alpha}\) 需要排序,时间复杂度 \(O(n\log n\log V)\)。(也可以 nth_element,\(O(n\log V)\))