제출 #1209394

#제출 시각아이디문제언어결과실행 시간메모리
1209394starship_666은행 (IZhO14_bank)C++20
100 / 100
150 ms16712 KiB
///////////////////////////////////////////
//                                       //
//     CODE BY THE phantomstar3.14       //
//                                       //
///////////////////////////////////////////


#include <bits/stdc++.h>
using namespace std;

#define int long long int
#define ull unsigned long long
 
std::mt19937_64 rng(std::chrono::steady_clock::now().time_since_epoch().count());
 
constexpr int V = 1E9;
constexpr int MAXN=1e9;
const int mod=1e9+7;

void solve() 
{
    int n,m;
    cin>>n>>m;
    vector<int> a(n,0), b(m,0);
    for(int i=0; i<n; i++)  cin>>a[i];
    for(int i=0; i<m; i++)  cin>>b[i];
    vector<pair<int,int>> dp((1ll<<m), {-1e18, -1e18});
    dp[0]={0,0}; // how many, left
    for(int i=0; i<(1ll<<m); i++)
    {
        for(int j=0; j<m; j++)
        {
            if((1ll<<j)&i == 0) continue;
            int subset=(1ll<<j) ^ i;
            int count=dp[subset].first;
            int left=dp[subset].second;
            if(count==-1e18 or left==-1e18) continue;
            if(count==n)
            {
                cout<<"YES\n";
                return;
            }
            if(left + b[j] == a[count])
                dp[i]={count+1, 0};
            else if (left+b[j] < a[count])
                dp[i]=max(dp[i], {count, left+b[j]});
        }
    }
    for(int i=0; i<(1ll<<m); i++)
    {
        int count=dp[i].first;
        if(count==n)
        {
            cout<<"YES\n";
            return;
        }
    }
    cout<<"NO\n";
}
 
int32_t main() 
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    auto begin = std::chrono::high_resolution_clock::now();
    //freopen("piggyback.in", "r", stdin);
    //freopen("piggyback.out", "w", stdout);
    int t=1;
    //cin >> t;
    
    while (t--) 
    {
        solve();
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
    cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...