Problem Description
A segment and all segments which are connected with it compose a segment set. The size of a segment set is the number of segments in it. The problem is to find the size of some segment set.

 

Input
In the first line there is an integer t - the number of test case. For each test case in first line there is an integer n (n<=1000) - the number of commands.


There are two different commands described in different format shown below:

P x1 y1 x2 y2 - paint a segment whose coordinates of the two endpoints are (x1,y1),(x2,y2).

Q k - query the size of the segment set which contains the k-th segment.

k is between 1 and the number of segments in the moment. There is no segment in the plane at first, so the first command is always a P-command.
 

Output
For each Q-command, output the answer. There is a blank line between test cases.
 

Sample Input

1
10
P 1.00 1.00 4.00 2.00
P 1.00 -2.00 8.00 4.00
Q 1
P 2.00 3.00 3.00 1.00
Q 1
Q 3
P 1.00 4.00 8.00 2.00
Q 2
P 3.00 3.00 6.00 -2.00
Q 5
 

Sample Output

1
2
2
2
5
这题可以用并查集做,主要是要判断两条线段是不是相交,我的方法是记两条线段的端点是p1(x1,y1),p2(x2,y2)以及p3(x3,y3),p4(x4,y4),分别看4个端点有没有在另一条线段上,如果有,那么相交,如果没有,那么再用叉积判断每条线段的两个端点是不是在另一条线段的两边,如果p1,p2在线段p3p4的两边而且p3,p4在线段p1p2的两边,那么p1p2和p3p4相交,否则不相交。那么怎么判断p1,p2是否在线段p3p4的两边呢,这里用到了叉积,第一次取p1,p3,p4,如果向量p1p3和向量p1p4的叉积是正的,那么p1p2在p3p4的顺时针方向,反之在逆时针方向。再取p2,p3,p4,方法相同,如果两个叉积符号不同,那么p1,p2在线段p3p4的两边,否则不在。
#include<stdio.h>
#include<string.h>
#include<math.h>
int pre[1006];
int
find(int x){
int
r=x;
while(
r!=pre[r])r=pre[r];
return
r;
} int
shizhen(double x2,double y2,double x4,double y4,double x5,double y5){
double
x=x4-x2,y=y4-y2,xx=x5-x2,yy=y5-y2;
if(
x*yy-xx*y>0)return 1;
else return -
1;
} int
xianshang(double x2,double y2,double x3,double y3,double x4,double y4){
if((
x2-x3)*(y4-y2)-(y2-y3)*(x4-x2)!=0)return 0;
if((
x2<x3 && x2<x4) || (x2>x3 && x2>x4))return 0;
return
1;
} int
panduan(double x2,double y2,double x3,double y3,double x4,double y4,double x5,double y5)
{
if(
xianshang(x2,y2,x4,y4,x5,y5) || xianshang(x3,y3,x4,y4,x5,y5) || xianshang(x4,y4,x2,y2,x3,y3) || xianshang(x5,y5,x2,y2,x3,y3))return 1;
if((
shizhen(x2,y2,x4,y4,x5,y5)*shizhen(x3,y3,x4,y4,x5,y5)<0) && (shizhen(x4,y4,x2,y2,x3,y3)*shizhen(x5,y5,x2,y2,x3,y3)<0))return 1;
return
0;
} int main()
{
int
T,n,m,i,j,a,t1,xianduan[1006],num[1005],num1,h;
double
x2[1006],x3[1006],y2[1006],y3[1006];
char
s[10];
scanf("%d",&T);
for(
h=1;h<=T;h++)
{

scanf("%d",&n);
num1=0;
for(
i=1;i<=n;i++){
pre[i]=i;num[i]=0;
} for(
i=1;i<=n;i++){
scanf("%s",s);
if(
s[0]=='P'){
num1++;
scanf("%lf%lf%lf%lf",&x2[num1],&y2[num1],&x3[num1],&y3[num1]);
num[num1]=1;
for(
j=1;j<=num1-1;j++){
if(
panduan(x2[j],y2[j],x3[j],y3[j],x2[num1],y2[num1],x3[num1],y3[num1])){
t1=find(j);
if(
num1!=t1){
pre[t1]=num1;num[num1]+=num[t1];
}
else continue;
}

//printf("%d ",panduan(x2[j],y2[j],x3[j],y3[j],x2[num1],y2[num1],x3[num1],y3[num1]));
}
//printf("\n");
}
else if(
s[0]=='Q'){
scanf("%d",&a);
t1=find(a);
printf("%d\n",num[t1]);
}
}
if(
h!=T)printf("\n");
/*for(i=1;i<=5;i++){
t1=find(i);
printf("%d ",num[t1]);
}
printf("\n");*/
}
return
0;
}

hdu1558 Segment set的更多相关文章

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558 解题报告:首先如果两条线段有交点的话,这两条线段在一个集合内,如果a跟b在一个集合内,b跟c在一 ...

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

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

  3. 2018.08.02 hdu1558 Segment set(并查集+计算几何)

    传送门 这个直接用并查集维护. 每加入一条线段就将它与其他能相交的集合合并,维护一个size" role="presentation" style="posit ...

  4. 【计算几何初步-线段相交+并查集】【HDU1558】Segment set

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. kafka的log存储解析——topic的分区partition分段segment以及索引等

    转自:http://blog.csdn.net/jewes/article/details/42970799 引言 Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相 ...

  6. ORA-10635: Invalid segment or tablespace type

    上周星期天在迁移数据时,碰到了ORA-10635: Invalid segment or tablespace type 错误,当时的操作环境如下: 操作系统版本: [oracle@xxxxx scr ...

  7. Oracle逻辑结构(TableSpace→Segment→Extent→Block)

    一.逻辑体系结构图 二.逻辑结构图组成介绍 从上表可以看出,一个数据库是由多个表空间(tablespace)组成,一个表空间又由多个段(segment)组成,一个段又由多个区(extent)组成,一个 ...

  8. IOS开发--自定义segment控件,方便自定义样式

    系统的segment控件太封闭,想换个颜色加个背景太难了,忍不住自己写一个,以备不时之需 这个控件给出了很多自定义属性的设置,用起来还是比较方便的,需要注意的 itemWidth如果不设置,则会按照控 ...

  9. 填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT

    填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT 警告:发生了重入! 解释:在主循环里调用了一个函数,而在中断服务中又一次调用了同样的函数.当主循环运行到该函数中 ...

随机推荐

  1. Spring框架之websocket源码完全解析

    Spring框架之websocket源码完全解析 Spring框架从4.0版开始支持WebSocket,先简单介绍WebSocket协议(详细介绍参见"WebSocket协议中文版" ...

  2. spring cloud gateway 自定义GatewayFilterFactory

    spring cloud gateway提供了很多内置的过滤器,那么因为需求的关系,需要自定义实现,并且要可配置,在一番折腾之后,总算是解决了,那么久记录下来 对于自定义的factory,我们可以选择 ...

  3. 使用CDN访问免备案网站

    如何使用CDN绕过服务器域名备案 前言 不得不说,大陆需要备案,时间真的有点长,至少得5天~20天起步,对于我们这些火急火燎的站长还是比较难受的.这里教大家如何使用cdn绕过备案, 访问速度很快,亲测 ...

  4. Goby资产扫描工具安装及报错处理

    官网: https://cn.gobies.org/index.html 产品介绍: 帮企业梳理资产暴露攻击面,新一代网络安全技术,通过为目标建立完整的资产数据库,实现快速的安全应急. 已有功能: 扫 ...

  5. wmic 查看主板信息

    查看主板信息的一个命令:wmic baseboard get 当然在命令提示符里查看,真的很费劲,所以我们将命令格式化一下:wmic baseboard get /format:HFORM >c ...

  6. 1.5V升3V芯片和电路图,DC-DC升压IC

    1.5V升3V的升压芯片,3V给LED供电,或者单片机模块供电等. PW5200A工作频率为1.4MHZ.轻载时自动PWM/PFM模式切换,提高效率. PW5200A能够提供2.5V和5V之间的可调输 ...

  7. MAX232数据方向

    在调试一个新板子的时候,串口调试从来都是放在前面的,而由于是一个新板子,电路图也是新的,因此有时候不知道串口线结对了没有,这个时候可能会对照PCB和原理图去看一下,但有时候看的人会很迷糊,因为不同的人 ...

  8. 中文电子病历命名实体识别(CNER)研究进展

    中文电子病历命名实体识别(CNER)研究进展 中文电子病历命名实体识别(Chinese Clinical Named Entity Recognition, Chinese-CNER)任务目标是从给定 ...

  9. (Oracle)取当前日期的最近工作日

      描述:现有一需求,日期表中存放了日期和是否节假日(0-工作日,1-节假日),现在需要取日期表中的最近的工作日.如2017/07/23(周日)最近的工作日应该是2017/07/21(周五).     ...

  10. js--数组的find()和findIndex()方法的使用介绍

    前言 阅读本文前先来思考一个问题,面对一个非空数组,你如何快速对数组进行遍历,如何快速找到数组中第一个我们需要关注的数据元素,并且如何知道该元素在数组中对应的下标索引,可能用for循环遍历,然后判断元 ...