|
|
看到这个题的第一眼就气笑了,都 2026 年了,出题人企图让我在代码里用小数运算。 这给了我一个提示:说不定这个与众不同题其实就是要用一些与众不同的算法。 注意到分配最多摊位的社团与分配最少摊位的社团的摊位差不超过 $30$,因为对于任意 $i,j$,都有 $u_i\times 2^{30}>u_j$。 好的,我们先执行这样的操作若干轮:每次都给一个社团一个摊位,但需要保证 $m-n\ge 30n$。 什么,暴力模拟会 TLE,没事,我们模拟倍增的过程分配。 此时 $m$ 被缩小到 $31n$ 这个级别了,直接用堆模拟即可,时间复杂度 $O(n\log^2 V)$。 注意到 COGS 机子太垃圾被卡常了,只能把 $m$ 缩小到 $30n$ 这个级别了。 最劣解喜加一。
题目4268 [THUPC 2025 pre] 摊位分配
AAAAAAAAAAA
2
评论
2026-01-30 20:30:20
|
|
|
官方题解。来源:清华大学学生算法协会仓库 $H$ 的数据范围暗示,需要高效的算法来确定分界值 $u^*$。由于分界值 $u^*$ 和划分出的席位数(即 $u_i/2^j \ge u^*$ 的 $(i,j)$ 对数)之间具有良好的单调关系,可以用二分 $u^*$ 的办法求解。 每次二分 $u^*$,对每个 $u_i$ 判断可以分得多少席位。整理不等式可得 $$j \le \log\frac{u_i}{u^*}$$ 故可以分得 $\left\lfloor\log(u_i/u^*)\right\rfloor$ 个席位。对每个 $u_i$ 可以 $O(1)$ 求解(假设忽略运算复杂度),则总复杂度为 $O(T\log H)$,可以通过本题。 直接对 $u^*$ 二分,可能会出现很大的精度问题:每个 $u_i$ 最少分得 $H/T$ 个席位,故 $$u^* \approx \frac{u_i}{2^{H/T}} \rightarrow 0$$ 一种解决办法是,对 $v^*=\log u^*$ 进行二分,则可以转化为 $j = \left\lfloor\log u_i − v^*\right\rfloor$,相对而言精度问题不大。 更进一步地,可以对 $v^*$ 的整数部分和小数部分分开求解。整数部分需要根据是否大于 $\left\lfloor\max\log u_i\right\rfloor$ 简单讨论,小数部分直接排序即可。这样可以完全避免精度问题。
题目4268 [THUPC 2025 pre] 摊位分配
AAAAAAAAAAA
评论
2026-01-30 20:18:38
|