双向广搜->世界冰球锦标赛(洛谷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';
}

浙公网安备 33010602011771号