输入线段的两个短点,如果线段相交那么他们属于一个集合,查看第i条线段所在的集合有几条线段。

好久没码码了,总是各种蠢。

首先找出两条直线的方程,求解相交点的横坐标,然后看是不是在线段内部。

没有注意题目中从1开始数,我自己写的从0开始数,各种wa。

同时,又受到了杭电的输出大坑(between和fllowed两种不同!!)

  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4. struct po
  5. {
  6. double lx,ly,rx,ry,k,b;//线段左端点和右端点的坐标,斜率,截距
  7. bool ok;//ok为1表示斜率存在,否则不存在
  8. };
  9. po me[];
  10. int li[];
  11. int num[];
  12. void init(int a)
  13. {
  14. int i;
  15. for(i=;i<=a;i++)
  16. {
  17. li[i]=i;
  18. num[i]=;
  19. }
  20. }
  21. int findme(int a)
  22. {
  23. if(a!=li[a])
  24. return li[a]=findme(li[a]);
  25. return li[a];
  26. }
  27. int main()
  28. {
  29. int t,i,j,n,k,tmp,w,tmpk,tmpw;
  30. double tmp1,tmp2,tmp3,tmp4,tmpx;
  31. char typ;
  32. while(scanf("%d",&t)!=EOF)
  33. {
  34. getchar();
  35. for(i=;i<=t;i++)
  36. {
  37. scanf("%d",&n);
  38. init(n);
  39. getchar();
  40. k=;
  41. for(j=;j<n;j++)
  42. {
  43. scanf("%c",&typ);
  44. if(typ=='P')
  45. {
  46. scanf("%lf%lf%lf%lf",&tmp1,&tmp2,&tmp3,&tmp4);
  47. me[k].ok=;
  48. if(tmp1<tmp3)
  49. {
  50. me[k].lx=tmp1;
  51. me[k].ly=tmp2;
  52. me[k].rx=tmp3;
  53. me[k].ry=tmp4;
  54. }
  55. else
  56. {
  57. me[k].lx=tmp3;
  58. me[k].ly=tmp4;
  59. me[k].rx=tmp1;
  60. me[k].ry=tmp2;
  61. }
  62. if(me[k].lx==me[k].rx)
  63. {
  64. me[k].ok=;
  65. }
  66. else
  67. {
  68. me[k].k=(me[k].ly-me[k].ry)/(me[k].lx-me[k].rx);
  69. me[k].b=me[k].ly-me[k].k*me[k].lx;
  70. }
  71. for(w=k-;w>=;w--)
  72. {
  73. tmpk=findme(k);
  74. tmpw=findme(w);
  75. if(tmpk!=tmpw)
  76. {
  77. if(me[k].ok&&me[w].ok)
  78. {
  79. tmpx=(me[k].b-me[w].b)/(me[w].k-me[k].k);
  80. if(me[k].lx<=tmpx&&me[k].rx>=tmpx&&me[w].lx<=tmpx&&me[w].rx>=tmpx)
  81. {
  82. li[tmpk]=tmpw;
  83. num[tmpw]+=num[tmpk];
  84. }
  85. }
  86. else if(me[k].ok)
  87. {
  88. if(me[k].lx<=me[w].lx&&me[k].rx>=me[w].rx)
  89. {
  90. li[tmpk]=tmpw;
  91. num[tmpw]+=num[tmpk];
  92. }
  93. }
  94. else if(me[w].ok)
  95. {
  96. if(me[w].lx<=me[k].lx&&me[w].lx>=me[k].rx)
  97. {
  98. li[tmpk]=tmpw;
  99. num[tmpw]+=num[tmpk];
  100. }
  101. }
  102. else if(me[w].lx==me[k].lx)
  103. {
  104. li[tmpk]=tmpw;
  105. num[tmpw]+=num[tmpk];
  106. }
  107. }
  108. }
  109. k++;
  110. }
  111. else if(typ=='Q')
  112. {
  113. scanf("%d",&tmp);
  114. tmp=findme(tmp);
  115. printf("%d\n",num[tmp]);
  116. }
  117. getchar();
  118. }
  119. if(i!=t)//输出大坑
  120. printf("\n");
  121. }
  122. }
  123. return ;
  124. }

HDU 1558的更多相关文章

  1. hdu 1558 (线段相交+并查集) Segment set

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...

  2. hdu 1558 Segment set 线段相交+并查集

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

  3. hdu 1558 线段相交+并查集路径压缩

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

  4. hdu 1558 线段相交+并查集

    题意:要求相交的线段都要塞进同一个集合里 sol:并查集+判断线段相交即可.n很小所以n^2就可以水过 #include <iostream> #include <cmath> ...

  5. HDU 1558 Segment set (并查集+线段非规范相交)

    题目链接 题意 : 如果两个线段相交就属于同一集合,查询某条线段所属集合有多少线段,输出. 思路 : 先判断与其他线段是否相交,然后合并. #include <cstdio> #inclu ...

  6. hdu 1558 Segment set

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

  7. HDU 1558 Segment set(并查集)

    题意: 给你一些线段的起点和终点的坐标,最后问和某个线段相连的或者间接相连的线段有多少个(包括本身)? P X1 Y1X2 Y2  起点(X1,X2)终点(X2,Y2):按照出现次数依次编号为1,2, ...

  8. hdu 1558(计算几何+并查集)

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

  9. hdu 1558 Segment set 计算几何+并查集★

    #include <cstdio> #include <iostream> #include <string.h> using namespace std; ; # ...

随机推荐

  1. COGS 1406. 邻居年龄排序[Age Sort,UVa 11462](水题日常)

    ★   输入文件:AgeSort.in   输出文件:AgeSort.out   简单对比时间限制:1 s   内存限制:2 MB [题目描述] Mr.Zero(CH)喜闻乐见地得到了一台内存大大增强 ...

  2. windows常用bat脚本

    windows常用bat脚本 https://blog.csdn.net/longyan_csc/article/details/78737722 Windows_批处理+任务计划实现文件夹定时备份 ...

  3. Java中类,对象,方法的内存分配

    Java中类,对象,方法的内存分配 以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的CodeSegment中. 当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一 ...

  4. ES6 第五章 字符串的新增方法 具体参照 http://es6.ruanyifeng.com

    1.FormCodePoint 对象方法 用于从 Unicode 码点返回对应字符,可以识别原来es5不能识别的大于0xFFFF的码点. String.fromCodePoint(0x20BB7) / ...

  5. linux 搜索文本

    find -type f -name '*.php'|xargs grep '127.0.0.1'  搜索所有.php 内容 127.0.0.1 转自:http://www.cnblogs.com/w ...

  6. JavaScript设计模式基础之this、call、apply

    1.this的指向 除去不常用的with和eval,具体应用中this指向大概能分为4种情况分别是 1.作为对象的方法调用. 2.作为普通函数的方法调用. 3.Function.prototype.c ...

  7. 【Linux】Centos6的iptables防火墙设置

    1,查看防火墙状态 # service iptables status //或 # /etc/init.d/iptables status 2,防火墙的启动.重启,关闭 # service iptab ...

  8. 条款18:让接口容易被正确使用,不易被误用(Make interface easy to use correctly and hard to use incorrectly)

    NOTE : 1.好的接口容易被正确使用,不容易被误用.应该让所有接口努力达成这些性质. 2.“促进正确使用”的办法包括接口的一致性,以及内置类型的行为兼容. 3.“阻止误用”的办法包括建立新类型/限 ...

  9. 爬虫app信息抓取之apk反编译抓取

    之前也抓过一些app,数据都比较好取,也没有研究的太深,毕竟还有android 模拟器+ appium 的方法.直到遇见了一款app ,具体名字就不说了,它安装在模拟器上竟然打不开 !!第一次遇见上网 ...

  10. Spring异常——BeanNotOfRequiredTypeException

    使用junit测试ssh搭建的框架的时候,遇到了一个异常: 异常消息: org.springframework.beans.factory.BeanCreationException: Error c ...