题目链接:https://ac.nowcoder.com/acm/problem/19964
代码:
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const int N = 5000005;
const ll ds = 1e15+7;
//const double p1 = 3.141592653589793238462643383;
using namespace std;
struct Node{
int u,v;
double w;
bool operator<(const Node& k)const{
return w < k.w;
}
}node[N];
int f[N];
int find(int x)
{
if(x != f[x]) return f[x] = find(f[x]);
else return f[x];
}
void merge(int x,int y)
{
x = find(x);
y = find(y);
if(x != y) f[x] = f[y];
}
int x[N],y[N],a[N];
void solve()
{
int n,m;
cin >> m;
for(int i = 1; i <= m; i++) cin >> a[i];
cin >> n;
for(int i = 1; i <= n; i++){
cin >> x[i] >> y[i];
}
int cnt = 0;
for(int i = 1; i <= n; i++){
for(int j = i+1; j <= n; j++){
node[cnt].u = i;
node[cnt].v = j;
node[cnt++].w = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
}
for(int i = 1; i <= n; i++) f[i] = i;
sort(node,node+cnt);
int t = 0,mmax;
for(int i = 0; i < cnt; i++){
int u = node[i].u;
int v = node[i].v;
int w = node[i].w;
if(find(u) != find(v)){
merge(u,v);
t++;
}
if(t == n-1) {
mmax = w;
break;
}
}
if(t != n-1) {
cout << 0;
}
else{
int ans = 0;
for(int i = 1; i <= m; i++){
if(a[i] >= mmax) ans++;
}
cout << ans;
}
}
int main()
{
solve();
return 0;
}