#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define ST first
#define ND second
#define PB push_back
int main() {
ios_base::sync_with_stdio(0);
ll n, m;
cin >> n >> m;
vector<pll> v, u;
v.PB({0, 0});
int max_usize=0;
for(ll i=0; i < n; i++) {
u.clear();
ll a;
cin >> a;
for(pll x : v) {
ll b = x.ST;
ll tot = __builtin_popcountll(b);
ll k = 0;
vector<pll> w;
if(a >= 0) {
ll ptot=tot-1;
while(b <= m) {
if(ptot < tot) {
w.PB({b+1, x.ND+tot*a});
ptot = tot;
}
while(true) {
if(((1LL<<k)&b) == 0) {
b|=(1LL<<k);
tot++;
break;
}
k++;
}
}
} else {
ll ptot = tot+1;
while(b <= m) {
if(ptot > tot) {
w.PB({b+1, x.ND+tot*a});
ptot = tot;
}
while(true) {
if(((1LL<<k)&b) != 0) {
b^=(1LL<<k);
tot--;
} else {
b^=(1LL<<k);
tot++;
break;
}
k++;
}
}
}
for(int j=w.size()-1; j >= 0; j--) {
if(u.size() == 0 || u.back().ST > w[j].ST) {
while(u.size() > 0 && u.back().ND <= w[j].ND) {
u.pop_back();
}
u.PB(w[j]);
}
}
}
// for(pll x : u) {
// cerr << x.ST << "," << -x.ND << " ";
// }
// cerr << "\n";
max_usize = max(max_usize, (int)u.size());
// cerr << "size: " << v.size() << " " << u.size() << endl;
swap(v, u);
}
// cerr << max_usize << "\n";
cout << v[0].ND << "\n";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define ST first #define ND second #define PB push_back int main() { ios_base::sync_with_stdio(0); ll n, m; cin >> n >> m; vector<pll> v, u; v.PB({0, 0}); int max_usize=0; for(ll i=0; i < n; i++) { u.clear(); ll a; cin >> a; for(pll x : v) { ll b = x.ST; ll tot = __builtin_popcountll(b); ll k = 0; vector<pll> w; if(a >= 0) { ll ptot=tot-1; while(b <= m) { if(ptot < tot) { w.PB({b+1, x.ND+tot*a}); ptot = tot; } while(true) { if(((1LL<<k)&b) == 0) { b|=(1LL<<k); tot++; break; } k++; } } } else { ll ptot = tot+1; while(b <= m) { if(ptot > tot) { w.PB({b+1, x.ND+tot*a}); ptot = tot; } while(true) { if(((1LL<<k)&b) != 0) { b^=(1LL<<k); tot--; } else { b^=(1LL<<k); tot++; break; } k++; } } } for(int j=w.size()-1; j >= 0; j--) { if(u.size() == 0 || u.back().ST > w[j].ST) { while(u.size() > 0 && u.back().ND <= w[j].ND) { u.pop_back(); } u.PB(w[j]); } } } // for(pll x : u) { // cerr << x.ST << "," << -x.ND << " "; // } // cerr << "\n"; max_usize = max(max_usize, (int)u.size()); // cerr << "size: " << v.size() << " " << u.size() << endl; swap(v, u); } // cerr << max_usize << "\n"; cout << v[0].ND << "\n"; } |
English