【UR #4】元旦激光炮 题解

【UR #4】元旦激光炮

THUWC 试机赛见到的题,没做出来,回来补上。

首先有 \(O(\log^2 n)\) 的做法:先猜测答案在某一个数组内,用二分找出该数组内最大的排名 \(\le k\) 的数(这里排名定义为所有数中小于它的个数 \(+ 1\)),然后再判断这个数的排名的区间是否包含 \(k\)(这里的说的排名和前文略有不同:由于有重复的数,一个数 \(x\) 的排名实际上是一个区间:小于 \(x\) 的数的个数 \(+ 1 \sim\) 小于 \(x + 1\) 的个数)。要计算该数组内一个数的排名,需要在另外两个数组内二分,查询次数 \(O(\log n)\)。总共计算 \(O(\log n)\) 次,因此总查询次数 \(O(\log^2 n)\)。可以得到 60 pts

然而这个做法没什么前途,正解和这个做法完全无关。

我们考虑解决问题常用的思想:把原问题不断转化为规模更小的子问题,直到规模小到可以直接得出答案。此问题中,假设我们能确定答案不在某个数组的前缀中,就可以把这个前缀丢掉,并且把 \(k\) 减去这个前缀的长度。具体而言,我们每次比较三个数组中第 \(\left\lfloor \frac{k}{3}\right\rfloor\) 个数的大小,然后丢掉最小数所在的数组的长为 \(\left\lfloor \frac{k}{3}\right\rfloor\) 的前缀。可以证明第 \(k\) 大的数不会在这个前缀中,证明如下:

由于数组递增,只需证明该数组中第 \(\left\lfloor \frac{k}{3}\right\rfloor\) 的排名小于 \(k\),也即证明小于它的数的个数不超过 \(k - 2\)。小于它的数只可能出现在三个数组的前 \((\left\lfloor \frac{k}{3}\right\rfloor - 1)\) 个数中,总数显然不超过 \(k - 2\),证毕。

AC 记录

总结:记住这个关键思想:把原问题不断转化为规模更小的子问题

posted @ 2025-01-16 21:52  DengStar  阅读(62)  评论(0)    收藏  举报