| 比赛 |
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
*/