题目大意:

  在一个平面上,给定N根线段,若某条线段与另一条线段相交,则将它们归于同个集合,给定k,问第k条线段所在的集合中线段的数量。

题目分析:

  问题主要考察计算几何和并查集。

  首先我们要判断两条线段是否能相交:线段P1P2与线段Q1Q2相交时,向量P1P2是夹在向量P1Q1和向量P1Q2中间,并且向量Q1Q2夹在向量Q1P1和Q1P2中间。这个可以用向量的叉乘来判断,如要判断向量P1P2是夹在向量P1Q1和向量P1Q2中间,只需判断 P1P2×P1Q1 * P1P2×P1Q2 < 0即可。但向量P1P2可能与Q1Q2共线,用刚才的叉乘的方法判别就得是:P1P2×P1Q1 * P1P2×P1Q2 = 0,并且线段P1P2和Q1Q2有部分重叠。

  然后就可以用并查集的套路进行解题了。

代码:

 #include<iostream>
using namespace std;
static int set[];
static int num[];
struct point{
double x, y;
};
struct edge{
point a, b;
}e[];
double cross(point a,point b,point c){//三点的叉乘
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
bool OnSegment(point a,point b,point c){//判断是否有重叠
return c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x)&&c.y>=min(a.y,b.y)&&c.y<=max(a.y,b.y);
} bool intersect(point a,point b,point c,point d) //判断是否相交
{
double d1,d2,d3,d4;
d1 = cross(c, d, a);
d2 = cross(c, d, b);
d3 = cross(a, b, c);
d4 = cross(a, b, d);
if(d1 * d2 < && d3 * d4 < ) return ;
else if(d1 == && OnSegment(c,d,a)) return ;
else if(d2 == && OnSegment(c,d,b)) return ;
else if(d3 == && OnSegment(a,b,c)) return ;
else if(d4 == && OnSegment(a,b,d)) return ;
return ;
} int find(int x){
int temp = x;
while( set[temp] != temp ){
temp = set[temp];
}
int root = temp;
temp = x;
while(set[temp] != root){
int t = temp;
temp = set[temp];
set[t] = root;
}
return root;
} void merge(int x, int y){
int fx = find(x);
int fy = find(y);
if(fx < fy){
set[fy] = fx;
num[fx] += num[fy];
}
else if(fx > fy){
set[fx] = fy;
num[fy] += num[fx];
}
}
int main(int argc, char const *argv[]){
int t, n;
cin >> t;
while(t--){
cin >> n; int k = ;
for(int i = ; i <= n; i++){
set[i] = i;
num[i] = ;
} while(n--){
string s;
cin >> s;
if(s == "P"){
k++;
cin >> e[k].a.x >> e[k].a.y >> e[k].b.x >> e[k].b.y;
for(int j = ; j <= k; j++){
if(find(k) != find(j) && intersect(e[k].a, e[k].b, e[j].a, e[j].b)) {
merge(k,j);
//break;
}
}
}
else if(s == "Q"){
int m;
cin >> m;
cout << num[find(m)] << endl;
} }
if(t) cout << endl;
} return ;
}

Segment set的更多相关文章

  1. kafka的log存储解析——topic的分区partition分段segment以及索引等

    转自:http://blog.csdn.net/jewes/article/details/42970799 引言 Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相 ...

  2. ORA-10635: Invalid segment or tablespace type

    上周星期天在迁移数据时,碰到了ORA-10635: Invalid segment or tablespace type 错误,当时的操作环境如下: 操作系统版本: [oracle@xxxxx scr ...

  3. Oracle逻辑结构(TableSpace→Segment→Extent→Block)

    一.逻辑体系结构图 二.逻辑结构图组成介绍 从上表可以看出,一个数据库是由多个表空间(tablespace)组成,一个表空间又由多个段(segment)组成,一个段又由多个区(extent)组成,一个 ...

  4. IOS开发--自定义segment控件,方便自定义样式

    系统的segment控件太封闭,想换个颜色加个背景太难了,忍不住自己写一个,以备不时之需 这个控件给出了很多自定义属性的设置,用起来还是比较方便的,需要注意的 itemWidth如果不设置,则会按照控 ...

  5. 填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT

    填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT 警告:发生了重入! 解释:在主循环里调用了一个函数,而在中断服务中又一次调用了同样的函数.当主循环运行到该函数中 ...

  6. c程序中出现segment error 和 bus error 的原因

    在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...

  7. 【BZOJ-3165】Segment 李超线段树(标记永久化)

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 368  Solved: 148[Submit][Sta ...

  8. BestCoder#16 A-Revenge of Segment Tree

    Revenge of Segment Tree Problem Description In computer science, a segment tree is a tree data struc ...

  9. [LintCode] Segment Tree Build II 建立线段树之二

    The structure of Segment Tree is a binary tree which each node has two attributes startand end denot ...

  10. [LintCode] Segment Tree Build 建立线段树

    The structure of Segment Tree is a binary tree which each node has two attributes start and end deno ...

随机推荐

  1. Winform(DataGridView)控件及通过此控件中实现增删改查

    DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx> ...

  2. 原生js实现jquery库中部分事件的功能(jquery库封装二)

    继续昨天的封装,今天的部分继昨天选择器之后实现了css样式的获取和添加,attr的获取和添加和一部分事件的封装:只是我自己的理解,不妥之处欢迎大家在评论中提出,相互学习,共同提高 /** * Crea ...

  3. PAT 1033. 旧键盘打字(20)

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在2行中分别给出坏掉的那些键.以及应该输入的文 ...

  4. Linux 进程间通讯详解七

    上图的一台主机服务器架构的重大缺陷是容易死锁 因为客户端,服务器都往同一消息队列中发送接收消息,假设消息队列已经满了,此时客户端无法向队列中发送消息,阻塞了,而服务器接收完一条消息后,想向消息队列发送 ...

  5. 重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  6. FineUI(专业版)实现百变通知框(无JavaScript代码)!

    博客园已经越来越不公正了,居然说我这篇文章没有实质的内容!! 我其实真的想问哪些通篇几十个字,没任何代码和技术分享,嚷嚷着送书的文章的就能雄霸博客园首页几天,我这篇文章偏偏就为管理员所容不下. 其实我 ...

  7. ECMAScript 6 Features 中文版

    ECMAScript 6 Features 中文版 如词不达意,欢迎提 PR & issue 采用中英混排的方式进行译制,如不解请查看对应原文 本文档将与原作者的 文档 保持同步更新,欢迎关注 ...

  8. datatable刷新表头

    使用jQuery的datatable生成表格数据,当需要改变表头时,调用Table.fnDestroy();再重新创建表头 var oTable = null; function initSettin ...

  9. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(二)

    Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现. shiro对缓存的支持 shiro并没有实现缓存 ...

  10. bzoj3527: [Zjoi2014]力

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...