hdu 1558 (线段相交+并查集) Segment set
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558
题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐标,当输入Q的时候输入n,然后输出与第n条线段相交的线段有多少条
首先判断线段是否相交,在算法导论p577上有介绍
线段A(x1,y1)-B(x2,y2),所在直线L1方程为F1(x,y)=0;
线段C(x3,y3)-D(x4,y4),所在直线L2方程为F2(x,y)=0;
如何判断两条线段有交点:(A,B在直线L2两侧) AND (C,D在直线L1两侧)。
用数学表达式来表示可以这样来表示:F2(x1,y1)*F2(x2,y2) >= 0 AND F1(x3,y3)*F1(x4,y4)>= 0; 等于0表示恰好在直线上
然后就是基础的并查集判断是否在一个集合以及集合内的线段的个数
#include<cstdio>
using namespace std;
int father[],num[];
void give()
{
for (int i=;i<=;i++)
{
father[i]=i;
num[i]=;
}
}
int _find(int x)
{
if (father[x]==x) return father[x];
father[x]=_find(father[x]);
return father[x];
}
double x1[],x2[],y1[],y2[];
double a[],b[];
int main()
{
int t,n,sx,sy,k,i,q;
char op;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
give();k=;
while (n--)
{
scanf(" %c",&op);
if (op=='P')
{
scanf("%lf %lf %lf %lf",&x1[k],&y1[k],&x2[k],&y2[k]);
a[k]=(y2[k]-y1[k])/(x2[k]-x1[k]);
b[k]=(x2[k]*y1[k]-x1[k]*y2[k])/(x2[k]-x1[k]);
for (i=;i<k;i++)
{
int t1=,t2=;
if (!((a[k]*x1[i]-y1[i]+b[k])*(a[k]*x2[i]-y2[i]+b[k])>))
t1=;
if (!((a[i]*x1[k]-y1[k]+b[i])*(a[i]*x2[k]-y2[k]+b[i])>))
t2=;
if (t1==&&t2==)
{
sx=_find(k);
sy=_find(i);
if (sx!=sy){
father[sx]=sy;
num[sy]+=num[sx];
}
}
}
k++;
}
else
{
scanf("%d",&q);
printf("%d\n",num[_find(q)]);
}
}
if (t) printf("\n");
}
return ;
}
hdu 1558 (线段相交+并查集) Segment set的更多相关文章
- hdu 1558 线段相交+并查集路径压缩
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 1558 线段相交+并查集
题意:要求相交的线段都要塞进同一个集合里 sol:并查集+判断线段相交即可.n很小所以n^2就可以水过 #include <iostream> #include <cmath> ...
- poj 1127:Jack Straws(判断两线段相交 + 并查集)
Jack Straws Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2911 Accepted: 1322 Descr ...
- HDU 1558 Segment set( 判断线段相交 + 并查集 )
链接:传送门 题意:输入一个数 n 代表有 n 组操作,P 是在平面内加入一条线段,Q x 是查询第 x 条线段所在相交集合的线段个数 例如:下图 5 与 1.2 相交,1 与 3 相交,2 与 4 ...
- 判断线段相交(hdu1558 Segment set 线段相交+并查集)
先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...
- [poj 1127]Jack Straws[线段相交][并查集]
题意: 给出一系列线段,判断某两个线段是否连通. 思路: 根据线段相交情况建立并查集, 在同一并查集中则连通. (第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..) 并 ...
- poj 1127 -- Jack Straws(计算几何判断两线段相交 + 并查集)
Jack Straws In the game of Jack Straws, a number of plastic or wooden "straws" are dumped ...
- TTTTTTTTTTTTTT poj 1127 Jack Straws 线段相交+并查集
题意: 有n个木棍,给出木棍的两个端点的x,y坐标,判断其中某两个线段是否连通(可通过其他线段连通) #include <iostream> #include <cstdio> ...
- TZOJ 1840 Jack Straws(线段相交+并查集)
描述 In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the ta ...
随机推荐
- spring boot 项目配置字符编码
- is 和 as 运算符
is和as运算符:is是判断是否是某个类型,返回true或falseo as Ren: 如果转换成功了,没问题:as 是用来转换如果没转换成功,不会报出错误,而是返回一个null值 例 实例化一个集合 ...
- 寒假生活第一天——Github初体验
快开学了,今天体验了一下github这个对我来说很是神秘的东西 它的定义来源于百度百科,如有异议,那就有吧.//gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格 ...
- 安装 gradle
Gradle是一种现在很流程的构建工具,目前基本和Maven平分天下,而且大有取而代之的趋势.这篇教程教大家怎么在linux上安装Gradle. 一.获得一台linux服务器 要在linux下安装gi ...
- nvm 安装
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash nvm install 8.9. ...
- python list [:1]
python 切片slice 1.补充: A = np.ones([, , ]) B = np.ones([, ]) C = A*B[:, None, :] C.shape = 2,1,4 https ...
- linux命令清除服务器缓存
linux 服务器开了某项服务或程序后,内存占用的非常大,停止服务或关闭进程后,内存不会立即释放,需要手动释放,使用命令 echo 3 > /proc/sys/vm/drop_chaches 释 ...
- CentOS 删除文件的常用命令
NO1. 删除当前目录的文件[root@rehat root]# rm test.txt NO2. 强制删除当前目录的文件,不弹出提示[root@rehat root]# rm -f test.txt ...
- python websocket网页实时显示远程服务器日志信息
功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看.你还在用 ...
- minSdk(API 26) > deviceSdk(API 19)解决方式
运行项目时出现“minSdk(API 26) > deviceSdk(API 19)”的提示,因为我用的是手机是sdk(API19)的,而项目要求是最低版本是minSdk(API 26),在我的 ...