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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| #include <bits/stdc++.h> #define debug(x) cerr<<#x<<":"<<x<<"\n";
using namespace std;
using ll = long long; const ll INF=(ll)1e17+3;
inline void solve(){ ll N,M; cin>>N>>M; vector<array<ll,2> > ab(N+5,{0,0}); for(int i=1;i<=N;++i){ cin>>ab[i][0]; } for(int i=1;i<=N;++i){ cin>>ab[i][1]; } sort(ab.begin()+1,ab.begin()+N+1,[](array<ll,2> a,array<ll,2> b){return a[1]>b[1];}); ll half=N/2;ll halfs=N-half; vector<vector<array<ll,2> > > mp(N+5); ll Ans=0; for(int i=0;i<=(1<<halfs);++i){ bitset<30> bi(i); ll lans=0,sum=0,cnt=0,cost=0; for(int j=0;j<=halfs-1;++j){ ll idx=j+half+1,b=ab[idx][1],a=ab[idx][0]; if(bi[j]){ cost+=a; lans+=sum; sum+=b; ++cnt; } } if(cost>M) continue; Ans=max(Ans,lans); mp[cnt].push_back({cost,lans}); } for(int i=1;i<=N;++i){ sort(mp[i].begin(),mp[i].end()); } for(int i=1;i<=N;++i){ if(mp[i].empty()) continue; ll mx=0; for(int j=0;j<(int)mp[i].size();++j){ mx=max(mx,mp[i][j][1]); mp[i][j][1]=mx; } } auto cal=[&](ll rem,ll sumB1)->ll{ ll res=0; for(int i=1;i<=N;++i){ auto it=upper_bound(mp[i].begin(),mp[i].end(),(array<ll,2>){rem,INF}); if(it==mp[i].begin()){ continue; } it=prev(it); ll val2=(*it)[1]; res=max(sumB1*i+val2,res); } return res; }; for(int i=0;i<=(1<<half);++i){ bitset<30> bi(i); ll lans=0,sum=0,cnt=0,cost=0; for(int j=0;j<=half-1;++j){ ll idx=j+1,b=ab[idx][1],a=ab[idx][0]; if(bi[j]){ cost+=a; lans+=sum; sum+=b; ++cnt; } } if(cost>M) continue; Ans=max(Ans,lans+cal(M-cost,sum)); } cout<<Ans<<"\n"; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); solve(); return 0; }
|