萌新刚学OI,问一个有关常数的小问题
  • 板块学术版
  • 楼主SIXIANG32
  • 当前回复25
  • 已保存回复25
  • 发布时间2020/10/23 20:35
  • 上次更新2023/11/5 10:05:04
查看原帖
萌新刚学OI,问一个有关常数的小问题
298549
SIXIANG32楼主2020/10/23 20:35

今天老师在讲二分(别问我为啥,就是会了再听一遍),然后老师见我深基的查找使用 STL 二分函数的,就让我再写一遍。
我就是不想写二分,写了个用 vector 实现挂链法的哈希(不想打链表 ing),吸了氧气,结果跑不过二分,是 vector 常数太大了还是我实现有错误。
这是为啥啊,给出两个代码

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int up,low,mid=0;
	int n,m;
	cin>>n>>m;
	int a[n+1],b[m+1];
	for(int p=1;p<=n;p++)cin>>a[p];
	for(int p=1;p<=m;p++)cin>>b[p];
	for(int p=1;p<=m;p++)
	{
		int ans=lower_bound(a+1,a+n+1,b[p])-a;
		if(a[ans]!=b[p])cout<<"-1 ";
		else cout<<ans<<' ';
	}
}
#include<iostream>
#include<vector>
#define MOD 1000000
using namespace std;
struct node{
	int val,id;
	node(int v,int i)
	{val=v,id=i;}
};
vector<node>hs[MOD+10];
struct Hash{
	int get_hash(int val)
	{
		return val%MOD;
	}
	void insert(int val,int id)
	{
		int pos=get_hash(val);
		hs[pos].push_back(node(val,id));
	}
	int find(int val)
	{
		int pos=get_hash(val);
		for(int p=0;p<hs[pos].size();p++)
			if(hs[pos][p].val==val)
				return hs[pos][p].id;
		return -1;
	}
};
int main()
{
	int n,m;
	cin>>n>>m;
	Hash has;
	for(int p=1,x;p<=n;p++)
		cin>>x,has.insert(x,p);
	for(int p=1,x;p<=m;p++)
		cin>>x,cout<<has.find(x)<<' ';
}
2020/10/23 20:35
加载中...