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 ...
随机推荐
- tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数(转)
tensorflow数据读取机制 tensorflow中为了充分利用GPU,减少GPU等待数据的空闲时间,使用了两个线程分别执行数据读入和数据计算. 具体来说就是使用一个线程源源不断的将硬盘中的图片数 ...
- js高级-模块化演变
function demo(){ var a = b = c = 9; // b,c全局变量 a局部变量 } demo(); console.log(b) 命名空间 var Shop = {} //顶 ...
- vue.js入门操作
1.vue框架是经典的MVVM模式, .vue文件是模板文件模板文件又分为3个部分一 <template></template>(html部分)二 <script> ...
- bind,call,applay的区别
方法调用模式: 当一个函数被保存为对象的一个方法时,如果调用表达式包含一个提取属性的动作,那么它就是被当做一个方法来调用,此时的this被绑定到这个对象. var a = 1 var obj1 = { ...
- vue-concise-slider 一个轻量的vue幻灯片组件
vue-concise-slider 一个轻量的vue幻灯片组件 阅读 541 收藏 35 2017-07-03 原文链接:github.com 外卖订单处理有烦恼?试试美团点评餐饮开放平台吧,可实现 ...
- git桌面工具下载git源码
第一步,登陆githup,搜索自己需要查看的代码. 并复制clone url. 第二步,复制下载资源:选择菜单--FILE--CLONE
- JMeter学习(二)录制脚本(转载)
转载自 http://www.cnblogs.com/yangxia-test 环境 Badboy version 2.1.1 JDK: 1.7.0_67 Apache JMeter-2.11 - ...
- 可上下拖动且有浮沉动画的View
package com.ifenglian.superapp1; import android.animation.Animator;import android.animation.Animator ...
- NDK环境搭建方法1
1.新建NdkDemo工程 2.新建NdkJniUtils类,在内部声明native方法 3.引用 4.build项目,生成NdkDemo\app\build\intermediates\classe ...
- Android笔记:Button
示例代码摘自<第一行代码> ButtonDemo.java的代码: public class ButtonDemo extends Activity { @Override protect ...