Untitled
unknown
plain_text
a year ago
3.7 kB
22
Indexable
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define all(v) v.begin() , v.end()
int n , s , mid , ans = LLONG_MAX;
vector<int> v;
vector<int> st0 , st1 , st2;
vector<int> end0 , end1 , end2;
void rec1(int i , vector<int> temp , int sum) {
if(temp.size() >= 3) {
int sz = temp.size();
if(sz >= 3 && temp[sz - 1] < 0 && temp[sz - 2] < 0 && temp[sz - 3] < 0) return;
}
if(i == mid) {
int sz = temp.size();
if(sz >= 2) {
if(temp[sz - 1] < 0 && temp[sz - 2] < 0 ) end2.push_back(sum);
else if(temp[sz - 1] < 0) end1.push_back(sum);
else end0.push_back(sum);
}
else if(sz) {
if(temp[sz - 1] < 0) end1.push_back(sum);
else end0.push_back(sum);
}
if(sum >= s) ans = min(ans , sum);
return;
}
temp.push_back(v[i]);
rec1(i + 1 , temp , sum + v[i]);
temp.pop_back();
rec1(i + 1 , temp , sum);
}
void rec2(int i , vector<int> temp , int sum) {
if(temp.size() >= 3) {
int sz = temp.size();
if(sz >= 3 && temp[sz - 1] < 0 && temp[sz - 2] < 0 && temp[sz - 3] < 0) return;
}
if(i == n) {
int sz = temp.size();
if(sz >= 2) {
if(temp[0] < 0 && temp[1] < 0) st2.push_back(sum);
else if(temp[0] < 0) st1.push_back(sum);
else st0.push_back(sum);
}
else if(sz) {
if(temp[0] < 0) st1.push_back(sum);
else st0.push_back(sum);
}
if(sum >= s) ans = min(ans , sum);
return;
}
temp.push_back(v[i]);
rec2(i + 1 , temp , sum + v[i]);
temp.pop_back();
rec2(i + 1 , temp , sum);
}
void solve() {
// meet in the middle
cin >> n >> s;
v = vector<int> (n);
for(auto &i : v) cin >> i;
mid = n / 2;
rec1(0 , {} , 0);
rec2(mid , {} , 0);
sort(all(st0));
sort(all(st1));
sort(all(st2));
for(int i = 0; i < end0.size(); ++i) {
mid = s - end0[i];
if(!st0.empty()) {
auto it = lower_bound(all(st0) , mid) - st0.begin();
if(it != st0.size()) ans = min(ans , end0[i] + st0[it]);// , cout << "a\n";
}
if(!st1.empty()) {
auto it = lower_bound(all(st1) , mid) - st1.begin();
if(it != st1.size()) ans = min(ans , end0[i] + st1[it]);// , cout << "b\n";
}
if(!st2.empty()) {
auto it = lower_bound(all(st2) , mid) - st2.begin();
if(it != st2.size()) ans = min(ans , end0[i] + st2[it]);// , cout << "c\n";
}
}
for(int i = 0; i < end1.size(); ++i) {
mid = s - end1[i];
if(!st0.empty()) {
auto it = lower_bound(all(st0) , mid) - st0.begin();
if(it != st0.size()) ans = min(ans , end1[i] + st0[it]);// , cout << "d\n";
}
if(!st1.empty()) {
auto it = lower_bound(all(st1) , mid) - st1.begin();
if(it != st1.size()) ans = min(ans , end1[i] + st1[it]);// , cout << "e\n";
}
}
for(int i = 0; i < end2.size() && !st0.empty(); ++i) {
mid = s - end2[i];
auto it = lower_bound(all(st0) , mid) - st0.begin();
if(it != st0.size()) ans = min(ans , end2[i] + st0[it]);// , cout << "f\n";
}
if(ans == LLONG_MAX) cout << "Impossible\n";
else cout << ans << '\n';
}
int32_t main() {
std::ios::sync_with_stdio(false);
ios_base::sync_with_stdio(false);
cout.tie(nullptr);
cin.tie(nullptr);
int t = 1; //cin >> t;
while (t--)solve();
}Editor is loading...
Leave a Comment