现在就是ump.count(i)更快
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int d, q;
unordered_map<int, int> ump, fa;
double computer_distance(int x1, int y1, int x2, int y2)
{
return sqrt(1ll * (x1 - x2) * (x1 - x2) + 1ll * (y1 - y2) * (y1 - y2) * 1.0);
}
int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int main()
{
scanf("%d %d", &d, &q);
int ans = 0;
while (q--)
{
int x, y;
scanf("%d %d", &x, &y);
ans++;
fa[x] = x;
ump[x] = y;
for (int i = x + 1; i <= x + d; ++i)
{
cout << "ump[i]: " << ump[i] << endl;
if (ump.count(i) == 0)//判断数据是否存在用ump[i]continue, 因为他是哈希,所以用ump[i]这种方式访问效率很低,具体原理现在不懂,但是以后多用ump.count(x)
continue;
if (ump[i] && computer_distance(i, ump[i], x, y) <= d * 1.0)
{
ll a = find(x), b = find(i);
if (a != b)
{
fa[a] = b;
ans--;
break;
}
}
}
for (int i = x - 1; i >= x - d; --i)
{
cout << "ump[i]: " << ump[i] << endl;
if (ump.count(i) == 0)
continue;
if (ump[i] && computer_distance(i, ump[i], x, y) <= d * 1.0)
{
ll a = find(x), b = find(i);
if (a != b)
{
fa[a] = b;
ans--;
break;
}
}
}
printf("%d\n", ans);
}
return 0;
}
学到了.