专栏文章

题解:CF1989D Smithing Skill

CF1989D题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mimzwtcv
此快照首次捕获于
2025/12/01 18:17
3 个月前
此快照最后确认于
2025/12/01 18:17
3 个月前
查看原文
显然先用 aba-b 较大的再用 aba-b 较小的,所以显然按照 aba-b 从小到大排序。
显然对于 aba-b 相同的,保留 aa 较小的即可。
然后你可以发现最多只会选 O(V)O(\sqrt V) 个数。
记忆化搜索一下,不知道为什么就过了。
codeCPP
#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 条评论,欢迎与作者交流。

正在加载评论...