最近的题目真的太难了,所以来刷刷水找回信心。
然而被水题虐爆了。
第一眼就知道要从大到小填正方形,然后空位直接暴力拆分。
大概长成一个 $O(n^2)$ 的样子,需要维护每个 $2^i \times 2^i$ 的正方形能过填多少个,理论可过。
但这东西看上去就很难做,马上不想写代码了。
于是考虑依然从大到小加入正方形,每次从左往右从上到下添加。
把大的正方形拆成四个小正方形进行计算,然后直接统计左上角区域是否能放完所有正方形。
只要过程中不产生冲突即可,记得开 long long
。
#include <bits/stdc++.h>
using namespace std;
const int M = 35;
int n, m, t;
int cnt[M];
int main() {
scanf("%d%d%d", &n, &m, &t);
for (int i = 1, x; i <= t; i++) scanf("%d", &x), cnt[x]++;
long long sum = 0;
for (int i = 25; i >= 0; i--) {
sum = (sum << 2) + cnt[i];
if ((n / (1 << i)) * 1ll * (m / (1 << i)) < sum) return puts("No"), 0;
}
puts("Yes");
return 0;
}