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

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

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

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

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

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = ;
const double eps = 1e-;
struct point
{
double x,y;
point(double x = ,double y = ):x(x),y(y) {}
inline friend point operator + (point p1,point p2)
{
return point(p1.x+p2.x,p1.y+p2.y);
}
inline friend point operator - (point p1,point p2)
{
return point(p1.x-p2.x,p1.y-p2.y);
}
}pos[maxn];
struct line
{
point s,e;
int flag;
}L[maxn];
int pre[maxn];
int find(int d)
{
return pre[d] == d? d:pre[d] = find(pre[d]);
}
inline double dot(point p1,point p2) //求叉积
{
return p1.x*p2.y - p2.x*p1.y;
}
int judge(point p1,point p2,point p3,point p4) //判断线段没有没交点
{
double temp1 = dot(p1-p3,p4-p3) * dot(p2-p3,p4-p3);
double temp2 = dot(p3-p1,p2-p1) * dot(p4-p1,p2-p1);
if((temp1 < || fabs(temp1) < eps) && (temp2 < || fabs(temp2) < eps)) return ;
return ;
}
int T,n,m;
void push(line t,line* L,int m)
{
for(int i = ;i < m;++i)
if(judge(L[i].s,L[i].e,t.s,t.e))
{
pre[find(t.flag)] = find(L[i].flag);
// break;
}
L[m] = t;
}
int query(int k)
{
int temp = find(k),ans = ;
for(int i = ;i <= m;++i)
if(find(i) == temp)
ans++;
return ans;
}
int main()
{
// freopen("in","r",stdin);
double x1,y1,x2,y2;
scanf("%d",&T);
for(int l = ;l < T;++l)
{
if(l) puts("");
scanf("%d",&n);
for(int i = ;i <= ;++i) //初始化并查集
pre[i] = i;
char oper[];
m = ; //初始化当前线段的数量
while(n--)
{
scanf("%s",oper);
if(oper[] == 'P')
{
line temp;
scanf("%lf%lf%lf%lf",&temp.s.x,&temp.s.y,&temp.e.x,&temp.e.y);
temp.flag = ++m;
push(temp,L,m);
}
else if(oper[] == 'Q')
{
int k;
scanf("%d",&k);
printf("%d\n",query(k));
}
}
// for(int i = 1;i <= m;++i)
// {
// for(int j = 1;j <= m;++j)
// printf(judge(L[i].s,L[i].e,L[j].s,L[j].e)? "1 ":"0 ");
// printf("\n");
// }
}
return ;
}

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. JavaScript中的事件对象

    JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...

  2. Install latest R for ubuntu

    ### delete old version rm -rf /usr/local/lib/R /usr/lib/R ~/**/R sudo apt-get autoremove rstudio sud ...

  3. NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)

    NSNotificationCenter //下面是不同类中需要实现的代码 1.[[NSNotificationCenter defaultCenter] addObserver:self selec ...

  4. 延时Led灯

    1.代码:#include <reg52.h>typedef unsigned int  u16;typedef unsigned char u8;sbit led = P1^0;void ...

  5. ASP.NET 递归将分类绑定到 TreeView

    CREATE TABLE [dbo].[sysMenuTree]([NoteId] [decimal](18, 0) NOT NULL,[ParentId] [decimal](18, 0) NULL ...

  6. Java之强引用、 软引用、 弱引用、虚引用

    1.强引用 平时我们编程的时候例如:Object object=new Object();那object就是一个强引用了.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它. ...

  7. js日期加减

    先补充下基础知识: var myDate = new Date(); //myDate默认返回当前时间 myDate.getYear(); //获取当前年份(2位) myDate.getFullYea ...

  8. Maven概览

    Maven的核心思想,约定由于配置 1 Maven坐标 1.1 本项目的坐标 groupId: 必须.项目组名称,定义当前Maven项目所隶属的实际项目,通常与域名反向一一对应,与Java包名表示方式 ...

  9. 关于Hash集合以及Java中的内存泄漏

    <学习笔记>关于Hash集合以及Java中的内存泄漏 标签: 学习笔记内存泄露hash 2015-10-11 21:26 58人阅读 评论(0) 收藏 举报  分类: 学习笔记(5)  版 ...

  10. 使用BLADE构建c++工程管理

    使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项 ...