This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()
#define sz(x) ((int)x.size())
#define PB push_back
#define MP make_pair
#define ft first
#define sd second
#define pll pair<ll, ll>
using namespace std;
typedef long long ll;
const ll OO = 1e18;
const int N = 14;
const int M = 1001 * N;
const int PW = (1 << N);
int n, m, a[N], b[N], mm, sum[PW];
bool mk[2][PW];
bitset<M> msk[PW], clr;
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
// freopen("penguins.in","r",stdin); freopen("penguins.out","w",stdout);
// freopen("in.txt","r",stdin);
cin >> n >> m;
mm = (1 << m);
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < m; i++) cin >> b[i];
bool was = 1;
mk[1][0] = 1;
for (int i = 1; i < mm; i++){
for (int j = 0; j < m; j++)
if ((i & (1 << j))){
sum[i] = sum[i ^ (1 << j)] + b[j];
break;
}
}
for (int it = 0; it < n; it++){
int cit = (it & 1);
was = 0;
fill(mk[cit], mk[cit] + mm, false);
for (int mask = 0; mask < mm; mask++) {
msk[mask] = clr;
if (mk[cit ^ 1][mask])
msk[mask][sum[mask]] = 1;
}
for (int k = 0; k < m; k++)
for (int mask = 0; mask < mm; mask++)
if ((mask & (1 << k)))
msk[mask] |= msk[(mask ^ (1 << k))];
for (int mask = 1; mask < mm; mask++){
if (sum[mask] < a[it]) continue;
int sm = sum[mask] - a[it];
if (msk[mask][sm]) {
mk[cit][mask] = 1;
was = 1;
}
}
}
cout << (was ? "YES" : "NO");
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |