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; ; # ...
随机推荐
- java读取大文件 超大文件的几种方法
java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能 import java.io.BufferedReader; import java.io.File; import jav ...
- easybcd 支持 windows 10 和 ubuntu 14.04 双系统启动
家里计算机系统 windows 10 全新安装. 原本是双系统的,还有一个ubuntu. windows 10 安装以后,恢复ubuntu就是问题了. (事后经验:请不要立刻安装bcd修改工具) 最初 ...
- jquery命名冲突
nodeName是jquery的关键字
- uva1412 Fund Management
状压dp 要再看看 例题9-17 /* // UVa1412 Fund Management // 本程序会超时,只是用来示范用编码/解码的方法编写复杂状态动态规划的方法 // Rujia Liu ...
- css内容补充之其它
1.overflow 当图片大小,超出div的大小时,可以指定overflow值为auto(带滚动条).hidden(隐藏,只显示一块): hover 当鼠标移动到当前标签上时,以下css属性才生效:
- 性能测试,如何得到大量token,并保存在本地文件中
需求:性能测试需要大量的token,模拟登陆 设计思路: 1.使用语言:python +request+正则匹配+写入本地 2.jmeter+函数助手+正则或者json/yaml+后置处理器beans ...
- springboot @test 使用
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class Springtest { ...
- C字符串指针遇到的问题
看下面的示例代码: int main() { char *ptr = "GeeksQuiz"; printf("%c\n", *&*&*ptr) ...
- CF633H Fibonacci-ish II
题目描述 题解: 坑题搞了三天. 莫队+线段树. 还有一些和斐波那契数列有关的性质. 首先答案是$a_1f_1+a_2f_2+…+a_nf_n$, 考虑插进去一个元素对答案产生的影响. 比如插进去一个 ...
- KNN算法原理及实现
1.KNN算法概述 kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类决策上只依据最邻近的一 ...