1 条题解
-
0
记 。
考虑一种方案合法的充要条件是什么。假设众数的出现次数为 ,则不能存在一种配料的出现次数 (否则众数就超过 了),这等价于 ;另一方面,不能存在一个蛋糕没有足够的配料可用,即 $\sum\limits_{i = 1}^n \lfloor \frac{a_i}{t} \rfloor \geq K$。显然 越小对第二个条件越好,因此直接让 取到 ,带入第二个条件可以得到:
$$\sum\limits_{i = 1}^n \lfloor \frac{a_i}{\lceil \frac{V}{K} \rceil} \rfloor \geq K$$于是我们得到了 的做法,下面考虑优化。
看到 ,可以联想到整除分块。我们把 按照阈值 分成大 和小 ,然后分别处理:
-
对于大 :此时 ,因此直接把所有 对应的左式的值全预处理出来存下,然后直接查表即可。
-
对于小 :此时 只有 种,因此直接预处理即可。
综上,总时间复杂度为 ,可以通过。
参考代码:
namespace Solution{ int n, q, a[100005], V; ll small[100005], big[100005]; inline void Solve(){ rd(n, q); fo(i, 1, n) rd(a[i]), V = max(V, a[i]); const int B = sqrtl(V) + 5; fo(K, 1, B) fo(i, 1, n) small[K] += a[i] / (int)ceil(1.0 * V / K); fo(t, 1, B) fo(i, 1, n) big[t] += a[i] / t; while(q--){ ll K; rd(K); if(K <= B){ wrs(small[K] >= K ? "YES" : "NO"), pc('\n'); }else{ wrs(big[(int)ceil(1.0 * V / K)] >= K ? "YES" : "NO"), pc('\n'); } } return; } } -
- 1
信息
- ID
- 12691
- 时间
- 2000ms
- 内存
- 1124MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者