好久没写过并查集了,居然1A,纪念一下
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
struct point
{
int x,y;
}p[1002];
int vis[30030];
int fa[300000];
int findd(int x)
{
int s;
for(s = x;s!=fa[s];s=fa[s])
;
int t;
while(x!=s)
{
t = fa[x];
fa[x] = s;
x = t;
}
return s;
}
void unionn(int x,int y)
{
int r1 = findd(x);
int r2 = findd(y);
if(r1!=r2)
{
fa[r1]=r2;
}
return ;
}
inline bool cal(int i,int j)
{
int x = p[i].x-p[j].x;
int y = p[i].y-p[j].y;
int dist = x*x+y*y;
if(dist<=m*m)
return true;
return false;
}
int main()
{
cin>>n>>m;
int i,j;
for(i=1;i<=n;i++)
{
cin>>p[i].x>>p[i].y;
}
for(i=0;i<=n;i++)
fa[i]=i;
char ch;
memset(vis,0,sizeof(vis));
int x,y;
while(cin>>ch)
{
if(ch == 'O')
{
cin>>x;
vis[x]=1;
for(j=1;j<=n;j++)
{
if(vis[j]&&cal(x,j))
{
unionn(x,j);
}
}
}
else if(ch == 'S')
{
cin>>x>>y;
if(findd(x)!=findd(y))
{
cout<<"FAIL"<<endl;
}
else
{
cout<<"SUCCESS"<<endl;
}
}
}
return 0;
}