输入线段的两个短点,如果线段相交那么他们属于一个集合,查看第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. android应用流量信息提取

    Linux 系统下所有的信息都是以文件的形式存在的,所以应用程序的流量信息也会被保存在操作系统的文件中.Android 2.2 版本以前的系统的流量信息都存放在 proc/net/dev(或者 pro ...

  2. tomcat 的log4j配置问题

    #log4j.rootLogger=DEBUG,stdout,filelog4j.rootLogger=ERROR,stdout,filelog4j.appender.stdout=org.apach ...

  3. env - 在重建的环境中运行程序

    SYNOPSIS(总览) env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...] DESCRIPTION(描述) 设置环境中的每个NAME为VAL ...

  4. react中的jsx详细理解

    这是官网上的一个简单的例子 const name = 'Josh Perez'; const element = <h1>Hello, {name}</h1>; ReactDO ...

  5. ssget使用方法

    语法: (ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list]) ssget 的参数均为可选参数,需要注意的是可选参数之间的组合条件.以下语法表 ...

  6. JS 冒泡事件顺序

    参考:https://www.cnblogs.com/diaoyan/p/5630014.html

  7. Spring-02 Java配置实现IOC

    Java配置 Spring4推荐使用java配置实现IOC Spring boot也推荐采用java配置实现IOC 在实际项目中,一般采用注解配置业务bean,全局配置使用Java配置. Java配置 ...

  8. Java中Synchronized和Lock的使用

    Lock的锁定是通过代码实现的,而 synchronized 是在 JVM 层面上实现的 synchronized在锁定时如果方法块抛出异常,JVM 会自动将锁释放掉,不会因为出了异常没有释放锁造成线 ...

  9. typedef重复定义 和 error: ‘long long long’ is too long for GCC

    今天发现一个很有意思的编译问题,然后在Stack Overflow上也有看到类似的.就是出现了 long long long 类型错误提示 错误提示如下: /home/yejy/algorithm_a ...

  10. Week06-继承、多态、抽象类与接口

    Week06-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口,Comparable,interface关键字,Comparator,继承 ...