专栏文章

U368054题解

个人记录参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mioigpsr
此快照首次捕获于
2025/12/02 19:44
3 个月前
此快照最后确认于
2025/12/02 19:44
3 个月前
查看原文
题意概述:有一个 nn 个数和一个 mm 个数的序列 aia_ibib_i,询问存不存在 ai×bj=ka_i \times b_j=knm5×105n,m \le 5 \times 10^5
针对 50%50\% 的数据:n3000,m3000n \le 3000,m \le 3000
暴力(50pts50pts):
一看到 n3000n \le 3000m3000m \le 3000,想到 O(nm)O(nm) 的暴力算法,枚举每个 iijj,判断 ai×bja_i \times b_j 是否等于 kk
正解(100pts100pts):
看到 n5×105n \le 5 \times 10^5m5×105m \le 5 \times 10^5,想到 O(nlogm)O(n \log m) 的算法。枚举对象太多超时了怎么办?减少枚举对象。只枚举 ii,询问 kai\dfrac{k}{a_i} 是否存在在 bb 序列中。这个可以用 set 处理,时间复杂度是 O(logm)O(\log m) 的。
当然,你也可以使用 map,时间复杂度也是 O(nlogm)O(n \log m)
目前暂时没数据,预计 8/10 就有了。
Code(不要抄代码):
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=500009;
set<int> s;
int a[N],b[N];
int main() {
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=m;i++)
		cin>>b[i],s.insert(b[i]);
	for(int i=1;i<=n;i++) {
		if(k%a[i]!=0) continue;
		int x=k/a[i];
		if(s.find(x)!=s.end()) {
			cout<<i<<" "<<*s.find(x);
			return 0;
		}
	}
	cout<<-1<<endl;
	return 0;
}
时间复杂度 O(nlogm)O(n \log m),足够通过本题。

评论

0 条评论,欢迎与作者交流。

正在加载评论...