#include <bits/stdc++.h> using namespace std; #pragma GCC optimization ("unroll-loops") #pragma GCC optimize("Ofast") const long long inf=2e18+2137; const int MAXN=1e6+10; pair<long long,long long> dp[2][MAXN]; bool cmp(pair<long long,long long> a,pair<long long,long long> b) { return (a.first!=b.first?a.first<b.first:(a.second>b.second)); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,lg,p=1,p2,l=0; long long m,v,nxt,mx,b; cin>>n>>m; lg=__lg(m)+1; dp[0][0].first=-1; while(n--) { cin>>v; p2=0; for(int x=l;x<p;x++) { for(int i=0;i<=lg;i++) { nxt=dp[0][x].first; if(!(i==0&&nxt>=0)) { while(__builtin_popcountll(++nxt)>i) nxt|=nxt-1; b=1; while(__builtin_popcountll(nxt)<i) nxt|=b,b<<=1; if(nxt<=m) dp[1][p2].first=nxt,dp[1][p2].second=dp[0][x].second+(long long)i*v,p2++; } } } sort(dp[1],dp[1]+p2,cmp); mx=-inf; p=0; for(int i=0;i<p2;i++) if(dp[1][i].second>mx) mx=dp[1][i].second,dp[0][p].first=dp[1][i].first,dp[0][p].second=dp[1][i].second,p++; l=max(0,p-5000); } mx=-inf; for(int i=l;i<p;i++) mx=max(mx,dp[0][i].second); cout<<mx<<'\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 | #include <bits/stdc++.h> using namespace std; #pragma GCC optimization ("unroll-loops") #pragma GCC optimize("Ofast") const long long inf=2e18+2137; const int MAXN=1e6+10; pair<long long,long long> dp[2][MAXN]; bool cmp(pair<long long,long long> a,pair<long long,long long> b) { return (a.first!=b.first?a.first<b.first:(a.second>b.second)); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,lg,p=1,p2,l=0; long long m,v,nxt,mx,b; cin>>n>>m; lg=__lg(m)+1; dp[0][0].first=-1; while(n--) { cin>>v; p2=0; for(int x=l;x<p;x++) { for(int i=0;i<=lg;i++) { nxt=dp[0][x].first; if(!(i==0&&nxt>=0)) { while(__builtin_popcountll(++nxt)>i) nxt|=nxt-1; b=1; while(__builtin_popcountll(nxt)<i) nxt|=b,b<<=1; if(nxt<=m) dp[1][p2].first=nxt,dp[1][p2].second=dp[0][x].second+(long long)i*v,p2++; } } } sort(dp[1],dp[1]+p2,cmp); mx=-inf; p=0; for(int i=0;i<p2;i++) if(dp[1][i].second>mx) mx=dp[1][i].second,dp[0][p].first=dp[1][i].first,dp[0][p].second=dp[1][i].second,p++; l=max(0,p-5000); } mx=-inf; for(int i=l;i<p;i++) mx=max(mx,dp[0][i].second); cout<<mx<<'\n'; } |