Gravatar
梦那边的原神
积分:1490
提交:157 / 288

看到这个题的第一眼就气笑了,都 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    
Gravatar
LikableP
积分:1755
提交:406 / 1072

官方题解。来源:清华大学学生算法协会仓库

$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$ 简单讨论,小数部分直接排序即可。这样可以完全避免精度问题。