题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558

解题报告:首先如果两条线段有交点的话,这两条线段在一个集合内,如果a跟b在一个集合内,b跟c在一个集合内,那么a跟c在一个集合内。在一个平面上,有两种操作:

P:在这个平面上添加一条线段

Q k:询问添加的第k条线段所在的那个集合有多少条线段

用并查集,然后就是要判断一下线段有没有交点。还有就是题目要求两个test之间要有空行,为此我还PE了一次。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. const int maxn = ;
  8. const double eps = 1e-;
  9. struct point
  10. {
  11. double x,y;
  12. point(double x = ,double y = ):x(x),y(y) {}
  13. inline friend point operator + (point p1,point p2)
  14. {
  15. return point(p1.x+p2.x,p1.y+p2.y);
  16. }
  17. inline friend point operator - (point p1,point p2)
  18. {
  19. return point(p1.x-p2.x,p1.y-p2.y);
  20. }
  21. }pos[maxn];
  22. struct line
  23. {
  24. point s,e;
  25. int flag;
  26. }L[maxn];
  27. int pre[maxn];
  28. int find(int d)
  29. {
  30. return pre[d] == d? d:pre[d] = find(pre[d]);
  31. }
  32. inline double dot(point p1,point p2) //求叉积
  33. {
  34. return p1.x*p2.y - p2.x*p1.y;
  35. }
  36. int judge(point p1,point p2,point p3,point p4) //判断线段没有没交点
  37. {
  38. double temp1 = dot(p1-p3,p4-p3) * dot(p2-p3,p4-p3);
  39. double temp2 = dot(p3-p1,p2-p1) * dot(p4-p1,p2-p1);
  40. if((temp1 < || fabs(temp1) < eps) && (temp2 < || fabs(temp2) < eps)) return ;
  41. return ;
  42. }
  43. int T,n,m;
  44. void push(line t,line* L,int m)
  45. {
  46. for(int i = ;i < m;++i)
  47. if(judge(L[i].s,L[i].e,t.s,t.e))
  48. {
  49. pre[find(t.flag)] = find(L[i].flag);
  50. // break;
  51. }
  52. L[m] = t;
  53. }
  54. int query(int k)
  55. {
  56. int temp = find(k),ans = ;
  57. for(int i = ;i <= m;++i)
  58. if(find(i) == temp)
  59. ans++;
  60. return ans;
  61. }
  62. int main()
  63. {
  64. // freopen("in","r",stdin);
  65. double x1,y1,x2,y2;
  66. scanf("%d",&T);
  67. for(int l = ;l < T;++l)
  68. {
  69. if(l) puts("");
  70. scanf("%d",&n);
  71. for(int i = ;i <= ;++i) //初始化并查集
  72. pre[i] = i;
  73. char oper[];
  74. m = ; //初始化当前线段的数量
  75. while(n--)
  76. {
  77. scanf("%s",oper);
  78. if(oper[] == 'P')
  79. {
  80. line temp;
  81. scanf("%lf%lf%lf%lf",&temp.s.x,&temp.s.y,&temp.e.x,&temp.e.y);
  82. temp.flag = ++m;
  83. push(temp,L,m);
  84. }
  85. else if(oper[] == 'Q')
  86. {
  87. int k;
  88. scanf("%d",&k);
  89. printf("%d\n",query(k));
  90. }
  91. }
  92. // for(int i = 1;i <= m;++i)
  93. // {
  94. // for(int j = 1;j <= m;++j)
  95. // printf(judge(L[i].s,L[i].e,L[j].s,L[j].e)? "1 ":"0 ");
  96. // printf("\n");
  97. // }
  98. }
  99. return ;
  100. }

HDU HDU1558 Segment set(并查集+判断线段相交)的更多相关文章

  1. hdu1558--并查集+判断线段相交

    简单的计算几何题,判断两线段是否相交.将相交的两线段使用并查集归到一类中.查询时输出线段对应集合中元素的个数. #include<stdio.h> struct Point{ double ...

  2. hdu 1558 Segment set (并查集)

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. 判断线段相交(hdu1558 Segment set 线段相交+并查集)

    先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...

  4. HDU - 1272 小希的迷宫 并查集判断无向环及连通问题 树的性质

    小希的迷宫 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一 ...

  5. HDU - 5438 Ponds(拓扑排序删点+并查集判断连通分量)

    题目: 给出一个无向图,将图中度数小于等于1的点删掉,并删掉与他相连的点,直到不能在删为止,然后判断图中的各个连通分量,如果这个连通分量里边的点的个数是奇数,就把这些点的权值求和. 思路: 先用拓扑排 ...

  6. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  7. hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)

    hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...

  8. hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)

     题目链接 /* 模板题-------判断欧拉回路 欧拉路径,无向图 1判断是否为连通图, 2判断奇点的个数为0 */ #include <iostream> #include <c ...

  9. P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)

    P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...

随机推荐

  1. JavaWeb---总结(一)JavaWeb开发入门

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  2. Processing Images

    https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_ ...

  3. lunix的查看Tomcat目录下日志的快速操作

    可以使用cd命令,cd命令的功能是切换到指定的目录: 命令格式:cd [目录名] 有几个符号作为目录名有特殊的含义: "/"代表根目录. ".."代表上一级目录 ...

  4. 先贴上代码:Random快排,快排的非递归实现

    设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为主元,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的是, ...

  5. js字符串RTrim方法(right trim)

    String.prototype.RTrim = function (c) { if (!c) { c = ' '; } var reg = new RegExp('([' + c + ']*$)', ...

  6. MySQL学习笔记——存储过程

  7. JavaScript排序算法——选择排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Windows 无法自动将 IP 协议堆栈绑定到网络适配器。解

    Windows 无法自动将 IP 协议堆栈绑定到网络适配器.解  昨天断网了,所以把珍藏已久的无线网卡拿出来蹭网.我系统是Windows 7 但是装上去东显示已启用,就是用不了,用windows诊断是 ...

  9. C#----操作应用程序配置文件App.config

    对配置文件的一些疑问: 在应用程序的目录下,有两处值得注意的地方,一个是应用程序根目录下的App.config文件,和bin\debug\name.exe.config 或者 bin\Release\ ...

  10. ecshop 调用收货地址

    html {insert_scripts files='region.js,utils.js'} <script type="text/javascript"> reg ...