输入线段的两个短点,如果线段相交那么他们属于一个集合,查看第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. UVA 10288 Coupons 彩票 (数学期望)

    题意:一种刮刮卡一共有n种图案,每张可刮出一个图案,收集n种就有奖,问平均情况下买多少张才能中奖?用最简的分数形式表示答案.n<=33. 思路:这题实在好人,n<=33.用longlong ...

  2. MySQL数据表查询操作

    准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名 ...

  3. dmesg -检测和控制内核环缓冲

    NAME dmesg - print or control the kernel ring buffer 总览 dmesg [ -c ] [ -n 级别 ] [ -s 缓冲区大小 ] 描述 dmesg ...

  4. uva10163 Storage Keepers

    习题9-9 注意前提是最小值最大.很少做两次dp的题. 初始化要细心. #include<iostream> #include<cmath> #include<algor ...

  5. java GZIP压缩与解压缩

    1.GZIP压缩 public static byte[] compress(String str, String encoding) { if (str == null || str.length( ...

  6. 【转】关于编写WPF UserControl时提示The name 'InitializeComponent' does not exist in the current contextr的解决!

    1.打开.csproj(工程)文件. 2.找到<Import Project="$(MSBuildBinPath)/Microsoft.CSharp.targets" /&g ...

  7. saltstack install on centos7

    saltstack offical website reference blog summary install virtualbox yum install VirtualBox-5.2 insta ...

  8. java值的传递

    public class Example { String str = new String("good"); char[] ch = {'a','b','c'}; public ...

  9. 连接远程docker内的mysql(navicat)

    拉取mysql镜像 docker pull mysql:5.6 查看mysql镜像 docker images | grep mysql 启动mysql容器 docker run -p 3306:33 ...

  10. [模板] LIS

    树状数组优化LIS到nlogn,网上找了好多,感觉讲得都不是很明白,正好自己复习整理一下. 基本的DP方程 f[i]=max(f[i],f[j]+1) (j<i且a[j]<a[i]) 定义 ...