题目链接: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. 模拟退火解决TSP问题

    // monituihuo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #includ ...

  2. matlab解三元二次方程组

    C1=7.0863; C2=6.8971; C3=0.4929; C4=0.8131; C5=1.8240; C6=3.8108; C7=3.7318; C8=-2.2238; C9=1.9905; ...

  3. GUI1_综合介绍

    最终比较,选择pyqt用于GUI开发 https://pythonspot.com/en/gui/ 图形化界面可以使用PyQt5, PyQt4, wxPython or Tk.模板 Graphical ...

  4. JavaWeb学习笔记——jsp基础语法

    1.JSP注释 显式注释 <!-- 注释内容 --> 隐式注释,隐式注释在客户端无法看见 // /* */ <% 注释内容 %> 2.Scriptlet(小脚本程序) 所有嵌入 ...

  5. Java排序算法——表插入排序

    //================================================= // File Name : ListInsertSort_demo //----------- ...

  6. Cache-Aside Pattern解析

    使用这种模式,可以帮助我们维护Cache中的数据. 使用Cache容易遇到的问题: 使用缓存,主要是为了将一些重复访问的数据存到缓存,开发者希望缓存中的数据和数据源中的保持一致,这就需要程序中有相应的 ...

  7. LaTex数学符号

    http://web.ift.uib.no/Teori/KURS/WRK/TeX/symALL.html

  8. Database Initialization Strategies in Code-First:

    You already created a database after running your Code-First application the first time, but what ab ...

  9. phpstorm webstorm安装主题 sublime样 还有都可以用的注册码

    注册码 webstorm phpstorm 基本所有版本通吃  webstrom9.0.3 通过 phpstorm 8.0.1 User Name: EMBRACE License Key: ==== ...

  10. spring boot入门例子

    最近学习spring boot,总结一下入门的的基础知识 1新建maven项目,修改pom.xml <project xmlns="http://maven.apache.org/PO ...