hdu 1558

来源:互联网 发布:手机怎么注册淘宝号 编辑:程序博客网 时间:2024/05/16 23:58
# include <iostream># include <stdio.h>using namespace std;int num[1010],pre[1010];char s[5];struct point{double x,y;};struct Edge{point a,b;}E[1010];double xmult(point a,point b,point c){//大于零代表a,b,c左转    return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}bool OnSegment(point a,point b,point c){        //a,b,c共线时有效    return c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x)&&c.y>=min(a.y,b.y)&&c.y<=max(a.y,b.y);}bool Cross(point a,point b,point c,point d){//判断ab 与cd是否相交    double d1,d2,d3,d4;    d1=xmult(c,d,a);    d2=xmult(c,d,b);    d3=xmult(a,b,c);    d4=xmult(a,b,d);    if(d1*d2<0&&d3*d4<0)  return 1;    else    if(d1==0&&OnSegment(c,d,a)) return 1;    else    if(d2==0&&OnSegment(c,d,b)) return 1;    else    if(d3==0&&OnSegment(a,b,c)) return 1;    else    if(d4==0&&OnSegment(a,b,d)) return 1;    return 0;}int Find(int x){return x==pre[x]?x:pre[x]=Find(pre[x]);}void unin(int i,int j){int x=Find(i);int y=Find(j);if(x!=y){pre[y]=x;num[x]+=num[y];}}int main (){int T,n;scanf("%d",&T);while(T--){scanf("%d",&n);int i;for(i=1;i<=n;i++){pre[i]=i;num[i]=1;}int j=0;for(i=1;i<=n;i++){int k;scanf("%s",s);if(s[0]=='P'){    j++;scanf("%lf%lf%lf%lf",&E[j].a.x,&E[j].a.y,&E[j].b.x,&E[j].b.y);for(k=1;k<j;k++){    //printf("%d  %d  \n",Cross(E[j].a,E[j].b,E[k].a,E[k].b),Find(k)!=Find(j));if(Find(k)!=Find(j)&&Cross(E[j].a,E[j].b,E[k].a,E[k].b)){unin(k,j);}}}else if(s[0]=='Q'){int temp;scanf("%d",&temp);printf("%d\n",num[Find(temp)]);}}if(T)   printf("\n");}return 0;}
//详细解法看算法导论
0 0