intさわだんのBlack History

刹那的レジェンドになりたい。

POJ(PKU) 2236 Wireless Network

顕著なunion-find

実行速度遅すぎる。

#include <cstdio>
#include <iostream>

using namespace std;

int par[1002];//親
int rank[1002];//木の深さ

void init(int n){
  for(int i = 0;i < n;i++){
    par[i] = i;
    rank[i] = 0;
  }
}

int find(int x){
  if(par[x] == x){
    return x;
  }else{
    return par[x] = find(par[x]);
  }
}

void unite(int x,int y){
  x = find(x);
  y = find(y);
  if(x == y) return;
  
  if(rank[x] < rank[y]){
    par[x] = y;
  }else{
    par[y] = x;
    if(rank[x] == rank[y])rank[x]++;
  }
}

bool same(int x,int y){
  return find(x) == find(y);
}
  
  
  
  

int main(){
  int n,f;
  int d[1003][3]={0};
  
  scanf("%d%d",&n,&f);
  
  for(int i = 1;i <= n;i++){
    scanf("%d%d",&d[i][0],&d[i][1]);
    d[i][2] = 0;
  }
  
  init(n);
  
  char t;
  
  while(cin >> t){

    
    if(t == 'O'){
      int p;
      scanf("%d",&p);
      
      d[p][2] = 1;
      
      int x = d[p][0];
      int y = d[p][1];
      
      for(int i = 1;i <= n;i++){
	if(d[i][2] != 1)continue;
	if(i == p)continue;
	
	int xx = d[i][0];
	int yy = d[i][1];
	
	if((x-xx)*(x-xx) + (y-yy)*(y-yy) <= f*f){
	  unite(p,i);
	}
      }
      
    }else{
      int p,q;
      
      scanf("%d%d",&p,&q);
      
      if(same(p,q)){
	printf("SUCCESS\n");
      }else{
	printf("FAIL\n");
      }
    }
  }
  
  return 0;
  
}