제출 #1218634

#제출 시각아이디문제언어결과실행 시간메모리
1218634giorgi123glmIce Hockey World Championship (CEOI15_bobek)C++20
100 / 100
895 ms860416 KiB
#include <algorithm>
#include <functional>
#include <iostream>
#include <fstream>
#include <list>
#include <unordered_map>
using namespace std;

#define int long long

signed main () {
    ios::sync_with_stdio (false);
    cin.tie (0);
    cout.tie (0);

    int N = 0, M = 0;
    cin >> N >> M;

    vector <int> v (N + 1);
    for (int i = 1; i <= N; i++)
        cin >> v[i];

    unordered_map <int, int> m (1e8);
    vector <int> bit_sum1 (1 << 20);
    m[0]++;
    for (int bit = 1; bit < (1 << (N / 2)); bit++) {
        const int bit_ind = 31 - __builtin_clz (bit);
        bit_sum1[bit] = bit_sum1[bit ^ (1 << bit_ind)] + v[bit_ind + 1];
        m[bit_sum1[bit]]++;
    }

    vector <pair <int, int> > m1 = {{-1e18, 0}};
    m1.reserve (m.size() + 10);
    for (const pair <int, int>& e : m)
        m1.push_back (e);
    sort (m1.begin(), m1.end());
    for (int i = 2; i < m1.size(); i++)
        m1[i].second += m1[i - 1].second;

    vector <int> bit_sum2 (1 << 20);
    int ans = (--lower_bound (m1.begin(), m1.end(), (pair <int, int>){M + 1, 0}))->second;
    
    for (int bit = 1; bit < (1 << (N - N / 2)); bit++) {
        const int bit_ind = 31 - __builtin_clz (bit);
        bit_sum2[bit] = bit_sum2[bit ^ (1 << bit_ind)] + v[bit_ind + 1 + N / 2];

        auto it = lower_bound (m1.begin(), m1.end(), (pair <int, int>){(M - bit_sum2[bit]) + 1, 0});
        ans += (--it)->second;
    }

    cout << ans << '\n';
}
#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...