제출 #1369536

#제출 시각아이디문제언어결과실행 시간메모리
1369536kawhietSan (COCI17_san)C++20
48 / 120
614 ms66228 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 47
#endif

#define int long long

map<int, int> get(vector<int> h, vector<int> g) {
    int n = h.size();
    map<int, int> ret;
    ret[0] = 1;
    for (int s = 1; s < (1 << n); s++) {
        int prv = 0, k = 0;
        bool ok = true;
        for (int i = 0; i < n; i++) {
            if (s & (1 << i)) {
                if (h[i] >= prv) {
                    prv = h[i];
                    k += g[i];
                } else {
                    ok = false;
                    break;
                }
            }
        }
        if (ok) {
            ret[k]++;
        }
    }
    return ret;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, k;
    cin >> n >> k;
    vector<int> h1, h2, g1, g2;
    for (int i = 0; i < n; i++) {
        int h, g;
        cin >> h >> g;
        if (h1.size() < 20) {
            h1.push_back(h);
            g1.push_back(g);
        } else {
            h2.push_back(h);
            g2.push_back(g);
        }
    }
    map<int, int> m1 = get(h1, g1);
    map<int, int> m2 = get(h2, g2);
    int s = 0;
    for (auto it = prev(m2.end()); it != m2.begin(); --it) {
        int val = it -> second;
        it -> second += s;
        s += val;
    }
    int ans = 0;
    for (auto [x, cnt] : m1) {
        auto it = m2.lower_bound(k - x);
        if (it != m2.end()) {
            ans += cnt * (it -> second);
        }
    }
    cout << ans << '\n';
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…