这道题涉及一个概念:任何一个数字都可以由若干个2^x(x可以取0,1,2……)构成,因此直接贪心,把输入的样例减掉,然后看看结果是不是为0
#include <bits/stdc++.h>
using namespace std;
#define ll long long
void solve() {
int m;
cin >> m;
vector<ll> cnt(30, 0); // cnt[v] 表示 2^v 的数量
while (m--) {
int t, v;
cin >> t >> v;
if (t == 1) {
cnt[v]++;
} else {
ll w = v;
// 从大到小处理
for (int i = 29; i >= 0; --i) {
ll power = 1LL << i;
ll take = min(cnt[i], w / power);
w -= take * power;
if (w == 0) break;
}
if (w == 0) {
cout << "YES\n";
} else {
cout << "NO\n";
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}