| 比赛 |
2026.9.5 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
Asteroid Mining |
最终得分 |
100 |
| 用户昵称 |
默 |
运行时间 |
2.567 s |
| 代码语言 |
C++ |
内存使用 |
17.50 MiB |
| 提交时间 |
2026-09-05 12:43:06 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INT_MAX (int)(1e18)
#define pr pair<int,int>
const int N=5e5+10;
const int M=55;
int n,m,len;
int li[N],lim[M];
pr a[N];
vector<int> g[M],dp[M][2];
vector<int> g1,dp1[2];
inline int read(){
int t=0,f=1;
register char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?(-1):(f),c=getchar();
while(c>='0'&&c<='9') t=(t<<3)+(t<<1)+(c^48),c=getchar();
return t*f;
}
signed main(){
// freopen("d1p1.7-133.in","r",stdin);
freopen("Mining.in","r",stdin);
freopen("Mining.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++) a[i].first=read(),a[i].second=read(),li[i]=a[i].second;
sort(li+1,li+1+n),len=unique(li+1,li+1+n)-(li+1);
for(int i=1;i<=n;i++) g[lower_bound(li+1,li+1+len,a[i].second)-li].push_back(a[i].first);
lim[len]=m/li[len];
for(int i=len-1;i>=1;i--) lim[i]=m%li[i+1]/li[i];
for(int i=1;i<=len;i++) sort(g[i].begin(),g[i].end()),reverse(g[i].begin(),g[i].end());
// for(int i=1;i<=len;i++) cout<<li[i]<<" "<<lim[i]<<" "<<g[i].size()<<"\n";
dp1[0].push_back(0),dp1[1].push_back(-INT_MAX);
for(int i=1;i<=len;i++){
int sum=0;
dp[i][0].resize(g[i].size()+g1.size()+1,-INT_MAX),
dp[i][1].resize(g[i].size()+g1.size()+1,-INT_MAX);
dp[i][0][0]=dp1[0][0],dp[i][1][0]=dp1[1][0];
for(int j=g1.size();j>=1;j--) dp1[0][j]-=dp1[0][j-1],dp1[1][j]-=dp1[1][j-1];
for(int j=0,j1=1,cnt=0;j<g[i].size()||j1<=g1.size();){
if(j1>g1.size()) dp[i][0][++cnt]=g[i][j++];
else if(j==g[i].size()||g[i][j]<dp1[0][j1]) dp[i][0][++cnt]=dp1[0][j1++];
else dp[i][0][++cnt]=g[i][j++];
}
for(int j=0,j1=1,cnt=0;j<g[i].size()||j1<=g1.size();){
if(j1>g1.size()) dp[i][1][++cnt]=g[i][j++];
else if(j==g[i].size()||g[i][j]<dp1[1][j1]) dp[i][1][++cnt]=dp1[1][j1++];
else dp[i][1][++cnt]=g[i][j++];
}
int maxv=g[i].size()+g1.size();
for(int j=1;j<=maxv;j++) dp[i][0][j]+=dp[i][0][j-1],dp[i][1][j]+=dp[i][1][j-1];
vector<int> g3;
for(int j=0,j1=0;j<(int)(g[i].size())||j1<(int)(g1.size());){
if(j1==g1.size()) g3.push_back(g[i][j++]);
else if(j==g[i].size()||g[i][j]<g1[j1]) g3.push_back(g1[j1++]);
else g3.push_back(g[i][j++]);
}
// cout<<"?\n";
// for(int i:g3) cout<<i<<" ";cout<<"\n";
// for(int j=0;j<=maxv;j++) cout<<dp[i][0][j]<<" "<<dp[i][1][j]<<"\n";
// cout<<"\n";
if(i==len) break;
swap(g1,g3);
dp1[0].clear(),dp1[1].clear();
vector<int> g2;
for(int j=0,cnt=0;j<=maxv;j+=li[i+1]/li[i],cnt++){
dp1[0].push_back(-INT_MAX),dp1[1].push_back(-INT_MAX);
int sum=0;
for(int k=j;k<min(maxv+1,j+li[i+1]/li[i]);k++){
if(k!=maxv) sum+=g1[k];
if(k-j<lim[i]) dp1[0][cnt]=max(dp1[0][cnt],max(dp[i][0][k],dp[i][1][k]));
else if(k-j==lim[i])
dp1[0][cnt]=max(dp1[0][cnt],dp[i][0][k]),dp1[1][cnt]=max(dp1[1][cnt],dp[i][1][k]);
else dp1[1][cnt]=max(dp1[1][cnt],max(dp[i][0][k],dp[i][1][k]));
}
if(maxv>=j+li[i+1]/li[i]) g2.push_back(sum);
}
swap(g1,g2);
// for(int i:g1) cout<<i<<" ";cout<<"\n";
// for(int i=0;i<dp1[0].size();i++) cout<<dp1[0][i]<<" "<<dp1[1][i]<<"\n";cout<<"\n";
}
int ans=-INT_MAX;
for(int i=0;i<dp[len][0].size();i++)
if(i<lim[len]) ans=max(ans,max(dp[len][0][i],dp[len][1][i]));
else if(i==lim[len]) ans=max(ans,dp[len][0][i]);
cout<<ans<<"\n";
return 0;
}