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

题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐标,当输入Q的时候输入n,然后输出与第n条线段相交的线段有多少条

首先判断线段是否相交,在算法导论p577上有介绍

线段A(x1,y1)-B(x2,y2),所在直线L1方程为F1(x,y)=0;
线段C(x3,y3)-D(x4,y4),所在直线L2方程为F2(x,y)=0;

如何判断两条线段有交点:(A,B在直线L2两侧) AND (C,D在直线L1两侧)。

用数学表达式来表示可以这样来表示:F2(x1,y1)*F2(x2,y2) >= 0 AND F1(x3,y3)*F1(x4,y4)>= 0; 等于0表示恰好在直线上

然后就是基础的并查集判断是否在一个集合以及集合内的线段的个数

 #include<cstdio>
using namespace std;
int father[],num[];
void give()
{
for (int i=;i<=;i++)
{
father[i]=i;
num[i]=;
}
}
int _find(int x)
{
if (father[x]==x) return father[x];
father[x]=_find(father[x]);
return father[x];
}
double x1[],x2[],y1[],y2[];
double a[],b[];
int main()
{
int t,n,sx,sy,k,i,q;
char op;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
give();k=;
while (n--)
{
scanf(" %c",&op);
if (op=='P')
{
scanf("%lf %lf %lf %lf",&x1[k],&y1[k],&x2[k],&y2[k]);
a[k]=(y2[k]-y1[k])/(x2[k]-x1[k]);
b[k]=(x2[k]*y1[k]-x1[k]*y2[k])/(x2[k]-x1[k]);
for (i=;i<k;i++)
{
int t1=,t2=;
if (!((a[k]*x1[i]-y1[i]+b[k])*(a[k]*x2[i]-y2[i]+b[k])>))
t1=;
if (!((a[i]*x1[k]-y1[k]+b[i])*(a[i]*x2[k]-y2[k]+b[i])>))
t2=;
if (t1==&&t2==)
{
sx=_find(k);
sy=_find(i);
if (sx!=sy){
father[sx]=sy;
num[sy]+=num[sx];
}
}
}
k++;
}
else
{
scanf("%d",&q);
printf("%d\n",num[_find(q)]);
}
}
if (t) printf("\n");
}
return ;
}

hdu 1558 (线段相交+并查集) Segment set的更多相关文章

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

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

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

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

  3. poj 1127:Jack Straws(判断两线段相交 + 并查集)

    Jack Straws Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2911   Accepted: 1322 Descr ...

  4. HDU 1558 Segment set( 判断线段相交 + 并查集 )

    链接:传送门 题意:输入一个数 n 代表有 n 组操作,P 是在平面内加入一条线段,Q x 是查询第 x 条线段所在相交集合的线段个数 例如:下图 5 与 1.2 相交,1 与 3 相交,2 与 4 ...

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

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

  6. [poj 1127]Jack Straws[线段相交][并查集]

    题意: 给出一系列线段,判断某两个线段是否连通. 思路: 根据线段相交情况建立并查集, 在同一并查集中则连通. (第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..) 并 ...

  7. poj 1127 -- Jack Straws(计算几何判断两线段相交 + 并查集)

    Jack Straws In the game of Jack Straws, a number of plastic or wooden "straws" are dumped ...

  8. TTTTTTTTTTTTTT poj 1127 Jack Straws 线段相交+并查集

    题意: 有n个木棍,给出木棍的两个端点的x,y坐标,判断其中某两个线段是否连通(可通过其他线段连通) #include <iostream> #include <cstdio> ...

  9. TZOJ 1840 Jack Straws(线段相交+并查集)

    描述 In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the ta ...

随机推荐

  1. 有关于tomcat启动时,利用listener来执行某个方法

    今天,项目经理让我调查一下(目的是锻炼我),刚开始的时候说用listener来实现服务器启动然后某个项目跟着启动.其实就是tomcat启动的时候去执行某个方法,通过这个方法启动某个项目.我网上调查了一 ...

  2. Java happen-before

    下面是happens-before原则规则: 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作: 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作 ...

  3. XML 可扩展标记语言

    因 为XML实在是太重要了,而且被广泛应用!不论是数据存储,还是其他方面,如配置文件等.XML是一种对独立于任何编程语言的数据进行编码的机制.在数据 交换领域,正在变得非常流行!因为他的基于节点的存储 ...

  4. 04_web基础(五)之cookie与session

    29.Http协议无记忆带来的问题 什么是会话:可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话. 在一 ...

  5. Typechecking With PropTypes

    [Typechecking With PropTypes] 1.props类型检查 React has some built-in typechecking abilities. To run typ ...

  6. FP ABPPMGR表 其它常用存储过程

    SAP_MATERIAL_SO:处理材料订单缺少BOM,ROUTING信息 1. 增加这部分订单的BOM信息         2. 增加这部分订单材料的ROUTING信息         3. 如果是 ...

  7. Dedecms织梦内容页获取当前页面顶级栏目名称方法

    Dedecms织梦做站的时候,需要在当前页面调用顶级栏目名称的时候,织梦默认{dede:field name='typename' /} 可以获取当前栏目页上一级栏目的名称,而不是当前栏目顶级栏目名称 ...

  8. pta l2-16(愿天下有情人都是失散多年的兄妹)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 题意:两个异性的人五服之内不得通婚 ...

  9. NumPy 字节交换

    NumPy 字节交换 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.字节顺序,是跨越多字节的程序对象的存储规则. 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地 ...

  10. POJ-3126.PrimePath(欧拉筛素数打表 + BFS)

    给出一篇有关素数线性筛和区间筛的博客,有兴趣的读者可以自取. 本题大意: 给定两个四位的素数,没有前导零,每次变换其中的一位,最终使得两个素数相等,输出最小变换次数.要求变换过程中的数也都是素数. 本 ...