HDU-1558-Segment set

来源:互联网 发布:刘意 java 编辑:程序博客网 时间:2024/06/06 06:34
#include<iostream>#include<string>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;/*    刚开始做的时候,想着遍历这么多次,时间应该不会很快,看来数据很水,62ms给A了;    这是一道线段相交+并查集的问题;题目意思是问你,他查询的编号有多少条线段是跟他有亲戚关系的;    说到亲戚关系很显然就是用并查集了,利用输入的顺序作为编号,将其连通;每输入一次q,就遍历一次    前面的线段,判断是否相交,如果相交就更新连通性;*/int pre[1005];typedef struct{    double x,y;}Point;Point a[1005],b[1005];//  判断直线AB是否与线段CD相交;bool Intersect(Point A,Point B,Point C,Point D){    //  直线方程F(x,y)为:(y-y1)*(x1-x2)-(x-x2)*(y1-y2)=0;    double FC=(C.y-A.y)*(A.x-B.x)-(C.x-A.x)*(A.y-B.y);    double FD=(D.y-A.y)*(A.x-B.x)-(D.x-A.x)*(A.y-B.y);    if(FC*FD<=0) return true;    else return false;}int Find(int x){    int r=x;    while(pre[r]!=r) r=pre[r];  //  寻找根节点。。。    //  路径压缩;    int i=x,j;    while(i!=r){        j=pre[i];        pre[i]=r;   //  将所有子节点直接指向根节点r;        i=j;    }    return r;}//  将输入的a,b代入,并连通,设fy为父节点。。。;void mix(int a,int b){    int fx=Find(a);    int fy=Find(b);    if(fx!=fy){        pre[fx]=fy;    }}int main(){    int t,n,q,p=0;    char ch;    scanf("%d",&t);    while(t--){        if(p) printf("\n"); //  忘了这个,结果给PE了一次;        p=1;        int cnt=1;        scanf("%d",&n);        //  并查集,初始化;        for(int i=1;i<=n;i++) pre[i]=i;        while(n--){            scanf(" %c",&ch);            if(ch=='P'){                scanf("%lf%lf%lf%lf",&a[cnt].x,&a[cnt].y,&b[cnt].x,&b[cnt].y);                for(int i=1;i<cnt;i++){                    //  如果相交,那么久添加连通量;用下标作为标志符;                    if(Intersect(a[i],b[i],a[cnt],b[cnt])&&Intersect(a[cnt],b[cnt],a[i],b[i])){                        mix(i,cnt);                        //cout<<'@'<<endl;                    }                }                cnt++;            }else{                int sum=0;                scanf("%d",&q);                //  查询,如果根节点与要查询的下标号相同,则就说明连通个数加一;                for(int i=1;i<=cnt;i++){                    if(Find(q)==Find(i)) sum++;                }                printf("%d\n",sum);            }            //for(int i=1;i<cnt;i++) cout<<i<<"-->"<<pre[i]<<endl;        }    }    return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 轮胎螺丝滑牙了怎么办 gta5ol寻宝任务退出了怎么办 gta5线上模式买房子之后怎么办 开摩托车忘记带安全头盔怎么办 gta不想要车了怎么办 空气滤芯进水会怎么办 车胎扎了个钉子怎么办 德罗索没导弹了怎么办 CF手雷包不能用怎么办 cfAK爆头碰到狙怎么办 玩cf网络延迟高怎么办 逆水寒装备分解错了怎么办 轴与孔间隙过大怎么办 小孩眼睛被打了怎么办 玩王者荣耀手机屏幕竖着怎么办 棉被被老鼠尿湿怎么办 打完子弹能下来怎么办 怪物猎人 弩子弹打完了怎么办 烤瓷牙龈发黑了怎么办 做彩超前喝水了怎么办 胸贴过敏红痒怎么办 芡粉里面有虫了怎么办 勾芡淀粉放多了怎么办 剁排骨没有好刀怎么办 硬币掉进档位里怎么办 魅族mx5手机太卡怎么办 华为m9手机声音小怎么办 放卡的地方堵住怎么办 美图m8蓝屏了怎么办 美图m8手机蓝屏怎么办 美图m6s手机白屏怎么办 魅蓝2开不开机怎么办 魅族手机主键没反应怎么办 魅族手机主键失灵怎么办 手机4g网络不稳定怎么办 华为m9收不到手机信息怎么办 华为手机wifi信号弱怎么办 手机连接wifi信号差怎么办 华华为p10信号不好怎么办 烟没拆封受潮了怎么办 和亲儿子发生了性关系怎么办