专栏文章
题解:CF1989D Smithing Skill
CF1989D题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mimzwtcv
- 此快照首次捕获于
- 2025/12/01 18:17 3 个月前
- 此快照最后确认于
- 2025/12/01 18:17 3 个月前
显然先用 较大的再用 较小的,所以显然按照 从小到大排序。
显然对于 相同的,保留 较小的即可。
然后你可以发现最多只会选 个数。
记忆化搜索一下,不知道为什么就过了。
code
CPP#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=1e6+5;
int T,n,m,q;
unordered_map<int,int> mp;
struct node{
int a,b;
bool operator <(const node &o) const{
if(a-b!=o.a-o.b) return a-b<o.a-o.b;
return a<o.a;
}
}f[N],g[N];
int solve(int x){
if(x<g[m].a) return 0;
if(mp.count(x)) return mp[x];
int l=1,r=m;
while(l<r){
int mid=l+r>>1;
if(x>=g[mid].a) r=mid;
else l=mid+1;
}
return mp[x]=2*((x-g[r].a)/(g[r].a-g[r].b)+1)+solve(x-((x-g[r].a)/(g[r].a-g[r].b)+1)*(g[r].a-g[r].b));
}
signed main(){
mp.reserve(1024);
mp.max_load_factor(0.25);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;++i) cin>>f[i].a;
for(int i=1;i<=n;++i) cin>>f[i].b;
sort(f+1,f+n+1);
g[m=1]=f[1];
int mi=f[1].a;
for(int i=2;i<=n;++i) if(f[i].a<mi) g[++m]=f[i],mi=f[i].a;
long long ans=0;
while(q--){
int x;
cin>>x;
ans+=solve(x);
}
cout<<ans<<endl;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...