一般大家实现离散化都是 sort
+ lowbit
但是这里也许有一种时间复杂度更优一点且更好写的实现,适合卡常时使用
我们需要使用 pb_ds 的hash表 ,不会的可以看我的 这篇文章
与正常离散化不同的是,我们使用 gp_hash_table
来代替离散化,同时还可以省去 去重 的步骤
由于哈希表单次操作的复杂度是 \(O(1)\) 的,所以总复杂度是 \(O(n log n + n)\)
常数小不少
具体实现方式见代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace std;
__gnu_pbds::gp_hash_table<int, int> hash_;
int tot_[1000100], tot,cnt_s;
int n, m;
int a[500100];
int b[500100];
bool cmp(int a, int b)
{
return a < b;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for (int ww = 1; ww <= n; ww++)
{
cin >> a[ww];
tot_[++tot] = a[ww];
}
for (int ww = 1; ww <= m; ww++)
{
cin >> b[ww];
tot_[++tot] = b[ww];
}
sort(tot_ + 1, tot_ + 1 + tot, cmp);//排序 O(n log n)
for (int ww = 1; ww <= tot; ww++)//O(n)
{
if (hash_[tot_[ww]] == 0)
{
cnt_s++;
hash_[tot_[ww]] =cnt_s;
}
}
bool tag_2 = 1;
for (int ww = 1; ww <= m; ww++)
{
bool tag_ = 1;
cout<<hash_[b[ww]]<<" " ;
}
return 0;
}
但是这样实现也有缺点,就是会有hash表的而外复杂度
标签:ww,离散,hash,int,复杂度,tot,写且,pb,ds From: https://www.cnblogs.com/sea-and-sky/p/18548738