HDU HDU1558 Segment set(并查集+判断线段相交)
题目链接: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(并查集+判断线段相交)的更多相关文章
- hdu1558--并查集+判断线段相交
简单的计算几何题,判断两线段是否相交.将相交的两线段使用并查集归到一类中.查询时输出线段对应集合中元素的个数. #include<stdio.h> struct Point{ double ...
- hdu 1558 Segment set (并查集)
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
- HDU - 1272 小希的迷宫 并查集判断无向环及连通问题 树的性质
小希的迷宫 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一 ...
- HDU - 5438 Ponds(拓扑排序删点+并查集判断连通分量)
题目: 给出一个无向图,将图中度数小于等于1的点删掉,并删掉与他相连的点,直到不能在删为止,然后判断图中的各个连通分量,如果这个连通分量里边的点的个数是奇数,就把这些点的权值求和. 思路: 先用拓扑排 ...
- HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)
hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...
- hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)
题目链接 /* 模板题-------判断欧拉回路 欧拉路径,无向图 1判断是否为连通图, 2判断奇点的个数为0 */ #include <iostream> #include <c ...
- P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)
P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...
随机推荐
- JavaWeb---总结(一)JavaWeb开发入门
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- Processing Images
https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_ ...
- lunix的查看Tomcat目录下日志的快速操作
可以使用cd命令,cd命令的功能是切换到指定的目录: 命令格式:cd [目录名] 有几个符号作为目录名有特殊的含义: "/"代表根目录. ".."代表上一级目录 ...
- 先贴上代码:Random快排,快排的非递归实现
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为主元,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的是, ...
- js字符串RTrim方法(right trim)
String.prototype.RTrim = function (c) { if (!c) { c = ' '; } var reg = new RegExp('([' + c + ']*$)', ...
- MySQL学习笔记——存储过程
- JavaScript排序算法——选择排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Windows 无法自动将 IP 协议堆栈绑定到网络适配器。解
Windows 无法自动将 IP 协议堆栈绑定到网络适配器.解 昨天断网了,所以把珍藏已久的无线网卡拿出来蹭网.我系统是Windows 7 但是装上去东显示已启用,就是用不了,用windows诊断是 ...
- C#----操作应用程序配置文件App.config
对配置文件的一些疑问: 在应用程序的目录下,有两处值得注意的地方,一个是应用程序根目录下的App.config文件,和bin\debug\name.exe.config 或者 bin\Release\ ...
- ecshop 调用收货地址
html {insert_scripts files='region.js,utils.js'} <script type="text/javascript"> reg ...