输入线段的两个短点,如果线段相交那么他们属于一个集合,查看第i条线段所在的集合有几条线段。

好久没码码了,总是各种蠢。

首先找出两条直线的方程,求解相交点的横坐标,然后看是不是在线段内部。

没有注意题目中从1开始数,我自己写的从0开始数,各种wa。

同时,又受到了杭电的输出大坑(between和fllowed两种不同!!)

#include<iostream>
#include<stdio.h>
using namespace std;
struct po
{
double lx,ly,rx,ry,k,b;//线段左端点和右端点的坐标,斜率,截距
bool ok;//ok为1表示斜率存在,否则不存在
};
po me[];
int li[];
int num[];
void init(int a)
{
int i;
for(i=;i<=a;i++)
{
li[i]=i;
num[i]=;
}
}
int findme(int a)
{
if(a!=li[a])
return li[a]=findme(li[a]);
return li[a];
}
int main()
{
int t,i,j,n,k,tmp,w,tmpk,tmpw;
double tmp1,tmp2,tmp3,tmp4,tmpx;
char typ;
while(scanf("%d",&t)!=EOF)
{
getchar();
for(i=;i<=t;i++)
{
scanf("%d",&n);
init(n);
getchar();
k=;
for(j=;j<n;j++)
{
scanf("%c",&typ);
if(typ=='P')
{
scanf("%lf%lf%lf%lf",&tmp1,&tmp2,&tmp3,&tmp4);
me[k].ok=;
if(tmp1<tmp3)
{
me[k].lx=tmp1;
me[k].ly=tmp2;
me[k].rx=tmp3;
me[k].ry=tmp4;
}
else
{
me[k].lx=tmp3;
me[k].ly=tmp4;
me[k].rx=tmp1;
me[k].ry=tmp2;
}
if(me[k].lx==me[k].rx)
{
me[k].ok=;
}
else
{
me[k].k=(me[k].ly-me[k].ry)/(me[k].lx-me[k].rx);
me[k].b=me[k].ly-me[k].k*me[k].lx;
}
for(w=k-;w>=;w--)
{
tmpk=findme(k);
tmpw=findme(w);
if(tmpk!=tmpw)
{
if(me[k].ok&&me[w].ok)
{
tmpx=(me[k].b-me[w].b)/(me[w].k-me[k].k);
if(me[k].lx<=tmpx&&me[k].rx>=tmpx&&me[w].lx<=tmpx&&me[w].rx>=tmpx)
{
li[tmpk]=tmpw;
num[tmpw]+=num[tmpk];
}
}
else if(me[k].ok)
{
if(me[k].lx<=me[w].lx&&me[k].rx>=me[w].rx)
{
li[tmpk]=tmpw;
num[tmpw]+=num[tmpk];
}
}
else if(me[w].ok)
{
if(me[w].lx<=me[k].lx&&me[w].lx>=me[k].rx)
{
li[tmpk]=tmpw;
num[tmpw]+=num[tmpk];
}
}
else if(me[w].lx==me[k].lx)
{
li[tmpk]=tmpw;
num[tmpw]+=num[tmpk];
}
}
}
k++;
}
else if(typ=='Q')
{
scanf("%d",&tmp);
tmp=findme(tmp);
printf("%d\n",num[tmp]);
}
getchar();
}
if(i!=t)//输出大坑
printf("\n");
}
}
return ;
}

HDU 1558的更多相关文章

  1. hdu 1558 (线段相交+并查集) Segment set

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...

  2. hdu 1558 Segment set 线段相交+并查集

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

  3. hdu 1558 线段相交+并查集路径压缩

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

  4. hdu 1558 线段相交+并查集

    题意:要求相交的线段都要塞进同一个集合里 sol:并查集+判断线段相交即可.n很小所以n^2就可以水过 #include <iostream> #include <cmath> ...

  5. HDU 1558 Segment set (并查集+线段非规范相交)

    题目链接 题意 : 如果两个线段相交就属于同一集合,查询某条线段所属集合有多少线段,输出. 思路 : 先判断与其他线段是否相交,然后合并. #include <cstdio> #inclu ...

  6. hdu 1558 Segment set

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

  7. HDU 1558 Segment set(并查集)

    题意: 给你一些线段的起点和终点的坐标,最后问和某个线段相连的或者间接相连的线段有多少个(包括本身)? P X1 Y1X2 Y2  起点(X1,X2)终点(X2,Y2):按照出现次数依次编号为1,2, ...

  8. hdu 1558(计算几何+并查集)

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

  9. hdu 1558 Segment set 计算几何+并查集★

    #include <cstdio> #include <iostream> #include <string.h> using namespace std; ; # ...

随机推荐

  1. java异常处理中的细节

    首先看一段代码 public class Test{ public static String output=""; public static void foo(int i){ ...

  2. 2019年今日头条机试_JAVA后台岗_第一题

        广度优先遍历: import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; class Nod ...

  3. EOS Dawn 3.0 智能合约 -- 新格式

    1.简介 随着EOS Dawn 3.0发布,智能合约的坑又要重新踩了o(╥﹏╥)o:3.0不仅将原来本身就在链里的基础合约独立出来,简单的介绍见3.0合约改变,合约的书写方式也有巨大变化,相比之前更加 ...

  4. Mybatis和Spring整合&逆向工程

    Mybatis和Spring整合&逆向工程Mybatis和Spring整合mybatis整合Spring的思路目的就是将在SqlMapConfig.xml中的配置移植到Spring的appli ...

  5. DoveCLL and Resistance(湖北省赛)

    题目 构造一个由串联和并联构成的纯电阻电路,使得该电路的等效电阻为p/q,其中(p,q) = 1.要求输出n,表示节点数,m表示电阻个数,m行每行ui,vi,wi,表示ui和vi之间要连上一个电阻为w ...

  6. python基础一 day6 序列操作集合

    列表删除:pop([index])有返回值 remove('元素‘)没有返回值 按元素删,元素是什么,就写什么,是数字就写数字,不要加引号,加引号就变成字符串了,没有就报错. 字典删除:pop( ’键 ...

  7. sklearn之SVC

    sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability= ...

  8. 全新Ubentu系统没有make,gcc命令解决办法

    一定要记得先update sudo apt-get update 然后输入下述命令即可 sudo apt-get install make sudo apt-get install gcc

  9. 什么是PHP中的heredoc和nowdoc

    heredoc结构类似于双引号字符串,nowdoc结构是类似于单引号字符串的.nowdoc结构很像heredoc结构,但是 nowdoc不进行解析操作. 这种结构很适合用在不需要进行转义的PHP代码和 ...

  10. Python简介--备份

    脚本开头指定解释器路径  /usr/bin/env  python  和  /usr/bin/python比较.(Linux在PATH中找到第一个路径的Python版本来执行) PATH中第一个路径是 ...