HDU 1558
输入线段的两个短点,如果线段相交那么他们属于一个集合,查看第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的更多相关文章
- hdu 1558 (线段相交+并查集) Segment set
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...
- hdu 1558 Segment set 线段相交+并查集
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- 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> ...
- HDU 1558 Segment set (并查集+线段非规范相交)
题目链接 题意 : 如果两个线段相交就属于同一集合,查询某条线段所属集合有多少线段,输出. 思路 : 先判断与其他线段是否相交,然后合并. #include <cstdio> #inclu ...
- hdu 1558 Segment set
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1558 Segment set(并查集)
题意: 给你一些线段的起点和终点的坐标,最后问和某个线段相连的或者间接相连的线段有多少个(包括本身)? P X1 Y1X2 Y2 起点(X1,X2)终点(X2,Y2):按照出现次数依次编号为1,2, ...
- hdu 1558(计算几何+并查集)
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 1558 Segment set 计算几何+并查集★
#include <cstdio> #include <iostream> #include <string.h> using namespace std; ; # ...
随机推荐
- 【转载】Hierarchal Temporal Memory (HTM)
最近在看机器学习,看能否根据已有的历史来预测Hardware的故障发生概率.下文是一篇很有意思的文章,转自 http://numenta.org/htm.html. NuPIC是一个开源项目,用来实现 ...
- Android-Emulator使用
1.查看当前android支持的avd版本 2.创建Emulator avd: android create avd -n magicyu -t 2 -n后面接需要创建avd的名字,-t后面接需要创建 ...
- npm与cnpm
npm介绍 说明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等) 使用npm安装插件:命令提示符执行npm instal ...
- mount nfs 各版本之间的转换
[root@one1-fst-hx ~]# mount.nfs 182.168.2.49:/mnt/sdb/nfs /mnt/nfs2/ nomand,-o vers=3[root@one1-fst- ...
- [SQL]连续三天有销售额
店铺 销售日期 销售额 A 2017-10-11 300 A 2017-10-12 200 B 2017-10-11 400 B 2017-10-12 200 A 2017-10-13 100 A 2 ...
- SFM作业
代码:https://github.com/jianxiongxiao/SFMedu PPT:http://3dvision.princeton.edu/courses/SFMedu/slides.p ...
- 连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法
MySQL新版默认使用caching_sha2_password作为身份验证插件,而旧版是使用mysql_native_password.当连接MySQL时报错“plugin caching_sha2 ...
- 【传智播客】Libevent学习笔记(三):事件循环
目录 00. 目录 01. event_base_loop函数 02. event_base_dispatch函数 03. event_base_loopexit函数 04. event_base_l ...
- 【讲●解】KMP算法
KMP算法 我们小组负责讲这个... 术语与规定 为了待会方便,所以不得不做一些看起来很拖沓的术语,但这些规定能让我们更好地理解\(KMP\)甚至\(AC\)自动机. 字符串匹配形式化定义如下: 假设 ...
- windows图标变空白解决方案
背景 对磁盘软件路径进行规整,把磁盘不同类型软件进行分类存储后,部分软件在windows桌面为空白,有些在start menu不为空白但是发送至桌面后却变成空白 解决方法 工具:search ever ...