hdu 1558(线段相交+并查集)
题意:给你一些操作,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(线段相交+并查集)相关推荐
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
- HDU 2473 Junk-Mail Filter(并查集的删除操作)
题目地址:HDU 2473 这题曾经碰到过,没做出来. .如今又做了做,还是没做出来. ... 这题涉及到并查集的删除操作.想到了设一个虚节点,可是我把虚节点设为了要删除的点的父节点.一直是栈溢出,目 ...
- 【BZOJ5005】乒乓游戏 [线段树][并查集]
乒乓游戏 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 5 1 1 5 1 5 11 2 ...
- 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]
Vladik and Entertaining Flags Time Limit: 20 Sec Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...
- hdu 3018 图 欧拉回路 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=3018 题意 --许多蚂蚁 遍历一个图 每一条边只能走一次 问至少要把这些蚂蚁分为几群 说白了就是 至少几笔可 ...
- UVA 1455 Kingdom 线段树+并查集
并查集维护:y的最大最小值.城市数量 线段树维护:城市数量,洲数量 合并两个集合时,先在线段树上删除两个子集合的旧的信息,然后再将合并完的新集合更新到线段树. //#pragma comment(li ...
- bzoj 2054: 疯狂的馒头(线段树||并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054 线段树写法: 点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前 ...
- HDU 4775 Infinite Go 并查集
题目链接:Infinite Go Infinite Go Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- hdu 1811(拓扑排序+并查集)
解题思路: 拓扑排序的两个性质: ①如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一 ②如果排序的总个数小于给定的个数,则说明存在回路 可以先把"="的两个数用并查集放在一个 ...
最新文章
- python是c语言写的吗-Python与C语言有什么区别?
- 全球及中国真空管太阳能集热器行业竞争状况及投资策略研究报告2021年版
- 1.2 位于Shell脚本第一行的#!
- STM32 软件重启导致死机的情况分析
- 机器学习_决策树_ID3算法_C4.5算法_CART算法及各个算法Python实现
- linux 如何连接无线网卡,CentOS 7如何连接无线网络
- python字典内置方法_柳小白Python学习笔记 12 内置方法之字典方法
- 蓝桥杯 基础练习 字母图形
- 扩展js对象数组的OrderByAsc和OrderByDesc方法
- LNMP 1.2/1.3+升级Nginx、MySQL/MariaDB、PHP教程
- socket基本使用
- js定义php中变量,JavaScript 变量
- 《Python和Pygame游戏开发指南》——导读
- 开源开放 | OMAHA 联合 OpenKG 发布新冠诊疗图谱数据
- ps2无线手柄连接arduino的使用方法
- 如何用一根网线连接两台电脑进行通信
- excel 计算复合增长率
- 微信小程序图片裁剪image-cropper插件使用
- 基于毕设的微信小程序校园二手商城实现(一)
- vue中的路由守卫(导航守卫)
热门文章
- mysql pool返回值_Mysql成神之路-InnoDB 的 Buffer Pool
- Linux编程 20 shell编程(shell脚本创建,echo显示信息)
- 暑假周报告(第三周)
- 俄科学家团队研发制备ALON新法,推进该材料在国防领域的应用
- Android下添加新的自定义键值和按键处理流程【转】
- Dubbo-Admin管理平台和Zookeeper注册中心的搭建(转)
- Cisco路由器基础安全配置---特权模式和VTY线路密码
- Java对战.NET,战争与和平的游戏
- Feb 26 Programming Notes
- if you want to reserve a place at the college library