题意:给你一些操作,P后边输入四个值,分别代表一条线段的起点、终点坐标,当输入Q时,后边输入一个整形值K,输出第k条线段所在的集合中包含的线段的个数。

解题思路:线段相交+并查集,sum[i]表示i所在的线段集合中,i为根节点的线段总数。在合并时可以更新。

#include<stdio.h>
#include<iostream>
using namespace std;struct point
{double x,y;
};
struct edge
{point a;point b;
}e[1010];
int fa[1010],sum[1010];int find(int x)
{if(fa[x] == x) return x;return fa[x] = find(fa[x]);
}void Union(int x,int y)
{int fx = find(x);int fy = find(y);if(fx != fy){fa[fx]=fy;sum[fy] += sum[fx];}
}
double xmult(point a,point b,point c) //大于零代表a,b,c左转
{return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
bool OnSegment(point a,point b,point c)         //a,b,c共线时有效
{return c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x)&&c.y>=min(a.y,b.y)&&c.y<=max(a.y,b.y);
}bool Cross(point a,point b,point c,point d) //判断ab 与cd是否相交
{double d1,d2,d3,d4;d1 = xmult(c,d,a);d2 = xmult(c,d,b);d3 = xmult(a,b,c);d4 = xmult(a,b,d);if(d1 * d2 < 0 && d3 * d4 < 0)    return 1;else if(d1 == 0 && OnSegment(c,d,a)) return 1;else if(d2 == 0 && OnSegment(c,d,b)) return 1;else if(d3 == 0 && OnSegment(a,b,c)) return 1;else if(d4 == 0 && OnSegment(a,b,d)) return 1;return 0;
}int main()
{int t,n,k,tmp,i,j;char s[10];scanf("%d",&t);while(t--){scanf("%d",&n);k = 0;for(int i = 1; i <= n; i++)sum[i] = 1, fa[i] = i;for(int i=1;i<=n;i++){scanf("%s",s);if(s[0]=='P'){k++;scanf("%lf%lf%lf%lf",&e[k].a.x,&e[k].a.y,&e[k].b.x,&e[k].b.y);for(int j=1;j<k;j++)if(Cross(e[k].a,e[k].b,e[j].a,e[j].b))Union(k,j);}else if(s[0]=='Q'){scanf("%d",&tmp);printf("%d\n",sum[find(tmp)]);}}if(t) printf("\n");}return 0;
}

hdu 1558(线段相交+并查集)相关推荐

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

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

  2. HDU 2473 Junk-Mail Filter(并查集的删除操作)

    题目地址:HDU 2473 这题曾经碰到过,没做出来. .如今又做了做,还是没做出来. ... 这题涉及到并查集的删除操作.想到了设一个虚节点,可是我把虚节点设为了要删除的点的父节点.一直是栈溢出,目 ...

  3. 【BZOJ5005】乒乓游戏 [线段树][并查集]

    乒乓游戏 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 5 1 1 5 1 5 11 2 ...

  4. 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]

    Vladik and Entertaining Flags Time Limit: 20 Sec  Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...

  5. hdu 3018 图 欧拉回路 并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=3018 题意  --许多蚂蚁 遍历一个图 每一条边只能走一次  问至少要把这些蚂蚁分为几群 说白了就是 至少几笔可 ...

  6. UVA 1455 Kingdom 线段树+并查集

    并查集维护:y的最大最小值.城市数量 线段树维护:城市数量,洲数量 合并两个集合时,先在线段树上删除两个子集合的旧的信息,然后再将合并完的新集合更新到线段树. //#pragma comment(li ...

  7. bzoj 2054: 疯狂的馒头(线段树||并查集)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054 线段树写法: 点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前 ...

  8. HDU 4775 Infinite Go 并查集

    题目链接:Infinite Go Infinite Go Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  9. hdu 1811(拓扑排序+并查集)

    解题思路: 拓扑排序的两个性质: ①如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一 ②如果排序的总个数小于给定的个数,则说明存在回路 可以先把"="的两个数用并查集放在一个 ...

最新文章

  1. python是c语言写的吗-Python与C语言有什么区别?
  2. 全球及中国真空管太阳能集热器行业竞争状况及投资策略研究报告2021年版
  3. 1.2 位于Shell脚本第一行的#!
  4. STM32 软件重启导致死机的情况分析
  5. 机器学习_决策树_ID3算法_C4.5算法_CART算法及各个算法Python实现
  6. linux 如何连接无线网卡,CentOS 7如何连接无线网络
  7. python字典内置方法_柳小白Python学习笔记 12 内置方法之字典方法
  8. 蓝桥杯 基础练习 字母图形
  9. 扩展js对象数组的OrderByAsc和OrderByDesc方法
  10. LNMP 1.2/1.3+升级Nginx、MySQL/MariaDB、PHP教程
  11. socket基本使用
  12. js定义php中变量,JavaScript 变量
  13. 《Python和Pygame游戏开发指南》——导读
  14. 开源开放 | OMAHA 联合 OpenKG 发布新冠诊疗图谱数据
  15. ps2无线手柄连接arduino的使用方法
  16. 如何用一根网线连接两台电脑进行通信
  17. excel 计算复合增长率
  18. 微信小程序图片裁剪image-cropper插件使用
  19. 基于毕设的微信小程序校园二手商城实现(一)
  20. vue中的路由守卫(导航守卫)

热门文章

  1. mysql pool返回值_Mysql成神之路-InnoDB 的 Buffer Pool
  2. Linux编程 20 shell编程(shell脚本创建,echo显示信息)
  3. 暑假周报告(第三周)
  4. 俄科学家团队研发制备ALON新法,推进该材料在国防领域的应用
  5. Android下添加新的自定义键值和按键处理流程【转】
  6. Dubbo-Admin管理平台和Zookeeper注册中心的搭建(转)
  7. Cisco路由器基础安全配置---特权模式和VTY线路密码
  8. Java对战.NET,战争与和平的游戏
  9. Feb 26 Programming Notes
  10. if you want to reserve a place at the college library