Segment set

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3548    Accepted Submission(s): 1324

Problem Description
A segment and all segments which are connected with it compose a segment set. The size of a segment set is the number of segments in it. The problem is to find the size of some segment set.



 
Input
In the first line there is an integer t - the number of test case. For each test case in first line there is an integer n (n<=1000) - the number of commands. 



There are two different commands described in different format shown below:



P x1 y1 x2 y2 - paint a segment whose coordinates of the two endpoints are (x1,y1),(x2,y2).

Q k - query the size of the segment set which contains the k-th segment.



k is between 1 and the number of segments in the moment. There is no segment in the plane at first, so the first command is always a P-command.
 
Output
For each Q-command, output the answer. There is a blank line between test cases.
 
Sample Input
1
10
P 1.00 1.00 4.00 2.00
P 1.00 -2.00 8.00 4.00
Q 1
P 2.00 3.00 3.00 1.00
Q 1
Q 3
P 1.00 4.00 8.00 2.00
Q 2
P 3.00 3.00 6.00 -2.00
Q 5
 
Sample Output
1
2
2
2
5
 
Author
LL
 

主要可能会直线重叠的情况,此时也算相交

所以若叉积为0 点积也为0时也算相交

代码如下:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
#define exp 0.000001
using namespace std;
int N,tot;
struct point
{
double x,y;
};
point S[10110],E[10011];
int Set[10110];
int ANS[10110];
int sgn(double x)
{
if(fabs(x)<exp) return 0;
else if(x<0) return -1;
else return 1;
}
double dotdet(double x1,double y1,double x2,double y2)
{
return x1*x2+y1*y2;
}
double dot(point a,point b,point c)
{
return dotdet(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
double crossdet(double x1,double y1,double x2,double y2)
{
return x1*y2-x2*y1;
}
double cross(point a,point b,point c)
{
return crossdet(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
double pan(point s1,point e1,point s2,point e2)
{
//跨立实验
double a1=cross(s1,e1,s2); //s1-e1 s2
double a2=cross(s1,e1,e2);
double a3=cross(s2,e2,s1);
double a4=cross(s2,e2,e1);
if(sgn(a1*a2)<0&&sgn(a3*a4)<0) return 1;
if((a1==0&&sgn(dot(s2,s1,e1))<=0)||
(a2==0&&sgn(dot(e2,s1,e1))<=0)||
(a3==0&&sgn(dot(s1,s2,e2))<=0)||
(a4==0&&sgn(dot(e1,s2,e2))<=0))
return 1;
return 0;
}
void CSH()
{
for(int i=0;i<=10001;i++)
{
Set[i]=i;
ANS[i]=1;
}
tot=0;
}
int find(int x)
{
if(x!=Set[x])
Set[x]=find(Set[x]);
return Set[x];
}
void UNION(int a,int b)
{
int a1=find(a);
int a2=find(b);
if(a1!=a2)
{
ANS[a1]+=ANS[a2];
Set[a2]=a1;
}
}
void input()
{
char ch;int temp;
CSH();
cin>>N;
getchar();
for(int i=1;i<=N;i++)
{
scanf("%c",&ch);
if(ch=='P')
{
tot++;
scanf("%lf%lf%lf%lf\n",&S[tot].x,&S[tot].y,&E[tot].x,&E[tot].y);
for(int i=1;i<tot;i++)
{
if(pan(S[i],E[i],S[tot],E[tot])==1)
{
UNION(i,tot);
}
}
}
else if(ch=='Q')
{
scanf("%d\n",&temp);
cout<<ANS[find(temp)]<<endl;
}
}
}
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main()
{
int T;
// init();
cin>>T;
int nn=0;
while(T--)
{
if(nn++) cout<<endl;
input();
}
return 0;
}

【计算几何初步-线段相交+并查集】【HDU1558】Segment set的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. 浅谈Android系统开发中LOG的使用

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...

  2. ThinkPHP视图查询详解

    ThinkPHP视图查询详解 参考http://www.jb51.net/article/51674.htm   这篇文章主要介绍了ThinkPHP视图查询,需要的朋友可以参考下     ThinkP ...

  3. html_day3

    总结学习html的第一天 表格的结构说明 <table></table> <tr></tr> <td></td> <th& ...

  4. MIT scheme入门使用

    在win7下可安装MIT-GUN scheme, 点开后有两个界面:一个交互式命令行界面:一个Edwin界面.    在命令行界面按Ctrl-G可以开始输入.在Edwin界面,输入完整命令后按Ctrl ...

  5. Jquery根据字段内容设置字段宽度

    来博客园很久了,初次写文章,新手,请大牛见谅! 前段时间遇到的问题,通过gridview后台动态生成table,列和行数量未知,要求根据每个单元格内容的多少,设置宽度,每一列选择本列最大的宽度. ta ...

  6. ios 动态修改UILabel字体大小

    - (IBAction)sliderChange:(id)sender {   NSLog(@"sliderChange");   UISlider *slider = (UISl ...

  7. C#总结(2)

    有输出,当然有输入.这样才会有人机交互. using System; using System.Collections.Generic; using System.Linq; using System ...

  8. Spring mvc中@RequestMapping 6个基本用法整理

    继续整理,这个是前段时间用jsp开发的一个站点,说起来php程序员去做jsp程序确实有些小不适应,但是弄完后绝对对于这种强类型语言而比收获还是颇多的. 1,最基本的,方法级别上应用 @RequestM ...

  9. SpringMvc项目 FastJson的数据中有$ref解决办法

    这是FastJson返回的数据,经过在线json格式转换工具转换的数据 阴影部分套用上面的dept(部门)信息,使用easyui只能获取第一行,凡是引用的都无法获取 经各种搜索: 推荐网址:http: ...

  10. mac上访问samba服务器

    打开safari输入smb://ip,回车后出现输入用户名密码对话框,若是匿名则选择作为“客人”选项 例子 smb://192.168.2.3