比赛 2026.9.5 评测结果 AAAAAAWWWWWAWWWWWWWWWWWWW
题目名称 Asteroid Mining 最终得分 28
用户昵称 郑霁桓 运行时间 2.192 s
代码语言 C++ 内存使用 15.49 MiB
提交时间 2026-09-05 12:49:51
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[500005],b[500005],as;
vector<long long>v,vv[55],pv;
unordered_map<long long,bool>mp;
inline long long dfs(long long x){
    if(x==v.size()-1) return 0;
    vector<long long>p0,pp,ppp;
    ppp=pv;
    if(x){//x-1->x
        pp.clear();
        long long ss=0;
        long long dx=v[x]/v[x-1];
        for(int j=0,tt=0;j<pv.size();j++){
            ss+=pv[j];
            tt++;
            if(tt==dx){
                pp.push_back(ss);
                tt=ss=0;
            }
        }
        if(ss) pp.push_back(ss);
        int l=0,r=0;
        pv.clear();
        p0.clear();
        long long tt=0;
        while(l<vv[x].size()&&r<pp.size()){
            if(vv[x][l]>=pp[r]) pv.push_back(vv[x][l]),l++,p0.push_back(tt);
            else pv.push_back(pp[r]),r++,p0.push_back(++tt);
        }
        while(l<vv[x].size()) pv.push_back(vv[x][l]),l++,p0.push_back(tt);
        while(r<pp.size()) pv.push_back(pp[r]),r++,p0.push_back(++tt);
    }
    long long pt=dfs(x+1);
    pt*=v[x+1]/v[x];
    long long ct=m/v[x];
    for(long long j=pt;j<min((long long)pv.size(),pt+ct);j++){
        as+=pv[j];
        m-=v[x];
    }
    pv=ppp;
    if(!x) return 0;
    return p0[min((long long)p0.size(),pt+ct)-1];
}
int main(){
    freopen("Mining.in","r",stdin);
    freopen("Mining.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>b[i];
        if(!mp[b[i]]) v.push_back(b[i]),mp[b[i]]=1;
    }
    sort(v.begin(),v.end());
    for(int i=1;i<=n;i++){
        int p=lower_bound(v.begin(),v.end(),b[i])-v.begin();
        vv[p].push_back(a[i]);
    }
    for(long long i=0;i<v.size();i++){
        sort(vv[i].begin(),vv[i].end());
        reverse(vv[i].begin(),vv[i].end());
    }
    for(long long i=0;i<vv[0].size();i++) pv.push_back(vv[0][i]);
    v.push_back(m+1);
    dfs(0);
    cout<<as;
    return 0;
}
/*
30 6
28 6
25 6
23 6
15 6
241 48
225 48
216 48
207 48
452 192
574 192
686 192
822 192
3396 1152
3778 1152
4516 1152
5364 1152
5493 1152
6010 1152
6033 1152
*/