双向广搜->世界冰球锦标赛(洛谷p4799)

题意:n<=40, m <= 1e18,n个数中,组合的和<=m的组合有多少种。

分析:n是40,双向广搜的思路,压缩搜索范围,分成2个 2^20进行搜索。 再二分查找合法的另一半中的元素数量

void solve(){
    long long n, m;
    cin >> n >> m;

    vector<long long> s;
    long long ans = 0;
    vector<long long> a;

    for (int i = 0; i < n; ++i){
        long long t;
        cin >> t;
        if (t <= m){
            a.emplace_back(t);
        }
    }

    n = int(a.size());
    int k = n / 2;

    function<void(int, int, long long, int)> dfs = [&](int idx, int p, long long sum, int state){
        if(idx == p || sum > m){
            if (sum > m){
                return;
            }
            if (state & 1){
                s.emplace_back(sum);
            }
            else{
                long long target = m - sum;
                int q = upper_bound(s.begin(), s.end(), target) - s.begin();
                ans += q;
            }
            return;
        }

        dfs(idx + 1, p, sum + a[idx], state);
        dfs(idx + 1, p, sum, state);
    };

    dfs(0, k, 0ll, 1);

    sort(s.begin(), s.end());

    dfs(k, n, 0ll, 0);

    cout << ans << '\n';
}
posted @ 2024-01-10 22:01  _Yxc  阅读(18)  评论(0)    收藏  举报