比赛 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;
}