HDU 1558 Segment set, 计算几何+并查集(二)

2014-11-24 11:43:28 · 作者: · 浏览: 4
2.跨立实验,u的两端点在v两侧,并且v的两端点在u两侧
if((((u.bgn-v.bgn)&(v.end-v.bgn))*((v.end-v.bgn)&(u.end-v.bgn))>=0)&&
(((v.bgn-u.bgn)&(u.end-u.bgn))*((u.end-u.bgn)&(v.end-u.bgn))>=0))
return true;
else return false;
}

Segment2D arr[N];
int Index, dnum[N];

int father[N];
void init(){
for(int i=0; i father[i]=i, dnum[i] = 1;
}

int find(int x){
int i, j=x;
while(j!=father[j]) j=father[j];
while(x!=j){
i = father[x];
father[x] = j;
x = i;
}
return j;
}

void Union(int x, int y){
int a = find(x);
int b = find(y);
if(a!=b)
father[a] = b;
}

int main(){
freopen("input.txt", "r", stdin);

int T,n,k,cas=1;
char cmd[2];
scanf("%d",&T);
while(T--){

scanf("%d", &n);
memset(dnum, 0, sizeof(dnum));
Index=0;
init();
while(n--){
scanf("%s", cmd);
if(cmd[0]=='P'){
cin >> arr[++Index];

for(int i=1; i<=Index-1; ++i){
if(SegmentIntersect(arr[i], arr[Index]))
Union(i, Index);
}
}
else if(cmd[0] == 'Q'){
scanf("%d", &k);
int x=find(k);
int cnt=0;
for(int i=1; i<=Index; ++i){
if(x==find(i))
++cnt;
}
cout << cnt << endl;
}
}
if(T) printf("\n");
}
return 0;
}
作者:shuangde800