Submission #1295650

#TimeUsernameProblemLanguageResultExecution timeMemory
1295650eldaees131313Ice Hockey World Championship (CEOI15_bobek)C++20
100 / 100
435 ms16860 KiB
////////////////////////////// Author:eldaee, coder_viper
#pragma GCC optimize ("Ofast")
#include <bits/stdc++.h>
#define int long long
#define str string
#define vec vector
#define dou double
#define ld long double
#define pb push_back
#define ppb pop_back
#define eb emplace_back
#define OK cout << "OK" << '\n'
#define Ok cout << "Ok" << '\n'
#define YES cout << "YES" << '\n'
#define Yes cout << "Yes" << '\n'
#define NO cout << "NO" << '\n'
#define No cout << "No" << '\n'
#define gcd __gcd
#define all(x) x.begin(),x.end()
#define eldaee ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

/*




*/

void solve() {
    int n, m;
    cin >> n >> m;
    vec<int> v(n);
    for(int i = 0; i < n; i++) {
        cin >> v[i];
    }
    int nc = n / 2;
    int nc1 = n - nc;
    int tot1 = 1;
    for(int i = 0; i < nc; i++) {
        tot1 *= 2;
    }
    vec<int> z(tot1, 0);
    for(int i = 0; i < nc; i++) {
        int s = 1;
        for(int j = 0; j < i; j++) {
            s *= 2;
        }
        for(int x = 0; x < tot1; x++) {
            if((x / s) % 2 != 0) {
                z[x] += v[i];
            }
        }
    }
    int tot2 = 1;
    for(int i = 0; i < nc1; i++) {
        tot2 *= 2;
    }
    vec<int> w(tot2, 0);
    for(int i = 0; i < nc1; i++) {
        int s = 1;
        for(int j = 0; j < i; j++) {
            s *= 2;
        }
        for(int x = 0; x < tot2; x++) {
            if((x / s) % 2 != 0) {
                w[x] += v[nc + i];
            }
        }
    }
    sort(all(w));
    int ans = 0;
    for(auto s1 : z) {
        int l = 0;
        int r = w.size() - 1;
        int cnt = -1;
        while(l <= r) {
            int mid = (l + r) / 2;
            if(s1 + w[mid] <= m) {
                cnt = mid;
                l = mid + 1;
            }
            else {
                r = mid - 1;
            }
        }
        if(cnt != -1) {
            ans += cnt + 1;
        }
    }
    cout << ans << "\n";
}

signed main() {
    eldaee

    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...