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 int long long
#define endl '\n'
using namespace std;
main(){
cin.tie(0)->sync_with_stdio(0);
int n; cin >> n;
int m; cin >> m;
vector <int> v(n), g(m);
for (int i = 0; i < n; i++)cin >> v[i];
for (int i = 0; i < m; i++)cin >> g[i];
if(n > m){
cout << "NO" << endl;
return 0;
}
if(n == m){
sort(v.begin(), v.end());
sort(g.begin(), g.end());
if(v == g){
cout << "YES" << endl;
}else cout << "NO" << endl;
return 0;
}
if(n == 1){
vector <int> dp(v[0]+1);
dp[0] = 1;
for (int i = 0; i < m; i++){
for (int j = v[0]; j >= 1; j--){
if(j-g[i] >= 0 and dp[j-g[i]])dp[j] = 1;
}
}
if(dp[v[0]]){
cout << "YES" << endl;
}else cout << "NO" << endl;
return 0;
}
if(m <= 10){
sort(v.begin(), v.end());
sort(g.begin(), g.end());
do{
int cnt = 0;
int ok = 0;
for (int i = 0; i < n; i++){
int sum = 0;
while(sum < v[i] and cnt < m){
sum+=g[cnt];
cnt++;
}
if((cnt == m and i != n-1) or sum != v[i]){
ok = 1;
break;
}
}
if(!ok){
cout << "YES" << endl;
return 0;
}
}while(next_permutation(g.begin(), g.end()));
cout << "NO" << endl;
return 0;
}
if(m <= 14 and n*2 <= m){
vector <int> used1(n), used2(m);
for (int i = 0; i < n; i++){
if(used1[i])continue;
for (int j = 0; j < m; j++){
if(used2[j] or used1[i])continue;
if(v[i] == g[j]){
used1[i] = 1;
used2[j] = 1;
break;
}
}
}
int ans = 0;
for (int i = 0; i < n; i++){
if(used1[i])continue;
for (int j = 0; j < m; j++){
if(used2[j])continue;
for (int k = j+1; k < m; k++){
if(used2[k] or used1[i] or used2[j])continue;
if(g[j] + g[k] == v[i]){
used1[i] = 1;
used2[k] = 1;
used2[j] = 1;
}
}
}
}
for (auto to : used1)ans+=to;
if(ans == n){
cout << "YES" << endl;
return 0;
}else cout << "NO" << endl;
return 0;
}
if(m <= 14){
int use = 0;
vector <vector <int>> cur(100);
int cnt = 0;
for (int i = 0; i < n; i++)use+=v[i];
for (int i = 0; i < (1<<m); i++){
vector <int> ans;
int x = i;
while(x > 0){
ans.push_back(x&1);
x>>=1;
}
reverse(ans.begin(), ans.end());
while(ans.size() < m)ans.push_back(0);
int sum = 0;
for (int j = 0; j < m; j++){
if(ans[j] == 1)sum+=g[j];
}
if(sum == use)cur[cnt] = ans, cnt++;
}
if(cnt > 10)assert(false);
for (int i = 0; i < cnt; i++){
vector <int> res;
for (int j = 0; j < (int)cur[i].size(); j++){
if(cur[i][j] == 1)res.push_back(g[j]);
}
sort(res.begin(), res.end());
do{
int idx = 0;
int ok = 0;
for (int j = 0; j < n; j++){
int sum1 = 0;
while(sum1 < v[j]){
sum1+=g[idx];
idx++;
}
if((idx == cnt and i != n-1) or sum1 != v[i]){
ok = 1;
break;
}
}
if(!ok){
cout << "YES" << endl;
return 0;
}
}while(next_permutation(res.begin(), res.end()));
cout << "NO" << endl;
return 0;
}
}
return 0;
}
Compilation message (stderr)
bank.cpp:5:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
5 | main(){
| ^~~~
bank.cpp: In function 'int main()':
bank.cpp:110:21: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
110 | while(ans.size() < m)ans.push_back(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... |