Problem 2194 星系碰撞

Accept: 14    Submit: 48
Time Limit: 30000 mSec    Memory Limit : 327680 KB

 Problem Description

据预测,大约在100亿年后,狮子座星系将与银河系发生碰撞,两个星系的碰撞将会合并两个星系,但是没有2个星球会相撞。现在某科学家得到两个星系合并后的结果,一些二维平面上的点,但是不知道那些星球属于银河系,已知如果两个星球属于同一个星系,那么他们之间的距离大于5光年,这边的距离指的是欧几里得距离,即(x1,y1)与(x2,y2)的距离为sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))。现在想请你帮忙把合并后的结果分成2个集合,一个属于银河系,一个属于狮子座星系,由于集合划分的方案可能有多种,现在想知道最多有多少个星球可能属于银河系。(可以所有星球都属于银河系)

例如:如下图有6个点,你可以有以下4中划分{{1, 2, 4, 5}, {3, 6}}; {{1, 2, 3, 4}, {5, 6}}; {{1, 4,5}, {2, 3, 6}}; {{1, 3, 4}, {2, 5, 6}} ,那么可以采用第一种划分{1,2,4,5} 都属于银河系,答案为4.

 Input

包含多组数据 每组数据输入第一行 一个整数N 表示星球个数(1<=N<=50000),接下去N 行 每行2个整数 x和y 表示星球的坐标(1<=x,y<=500000),没有重合的点。

 Output

输出一行一个整数表示最多有多少个星球属于银河系。如果没办法进行划分那么输出-1。

 Sample Input

6
1 3
9 1
11 7
5 7
13 5
4 4

 Sample Output

4
分析:把所有的行星按照x坐标从小到大排序,然后枚举两点(加剪枝)距离,若距离小于等于5,若这两个点不在一个集合当中,则加入一个集合,并且这两个相连的点染为不同的颜色,若这两个点在一个集合当中,则判定矛盾,因为再改集合中至少有三个点,他们两两之间的距离都小于等于5,就是说无论怎样分配他们都无法满足题目要求,如果不存在矛盾的情况,则计算出每个集合当中被染成两种颜色的个数max1和max2,最后把所有集合当中的较大者加起来即:sum+=max(max1[k]+max2[k])(k属于不同的集合)
程序;
#include"stdio.h"
#include"string.h"
#include"math.h"
#include"iostream"
#include"queue"
#include"algorithm"
#include"stack"
#include"map"
#include"string"
#define M 50009
#define inf 0x3f3f3f3f
#define eps 1e-9
#define LL __int64
using namespace std;
struct node
{
int x,y;
}p[M];
int cmp(node a,node b)
{
return a.x<b.x;
}
LL dist(node a,node b)
{
return (LL)(a.x-b.x)*(a.x-b.x)+(LL)(a.y-b.y)*(a.y-b.y);
}
int f[M],max1[M],max2[M],sum[M];
int finde(int x)
{
if(x!=f[x])
{
int t=f[x];
f[x]=finde(f[x]);
sum[x]=(sum[x]+sum[t])%2;
}
return f[x];
}
int ok(int n)
{
for(int i=0;i<n;i++)
{
f[i]=i;
sum[i]=0;
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(p[j].x-p[i].x>5)break;
if(dist(p[i],p[j])<=25LL)
{
int x=finde(i);
int y=finde(j);
if(x!=y)
{
f[y]=x;
sum[y]=(sum[x]+sum[i]+1-sum[j])%2;
}
else
{
if(sum[x]==sum[y])
return -1;
} }
}
}
memset(max1,0,sizeof(max1));
memset(max2,0,sizeof(max2));
for(int i=0;i<n;i++)
{
int y=finde(i);
f[i]=y;
if(sum[i]==0)
max1[y]++;
else
max2[y]++;
}
int ans=0;
for(int i=0;i<n;i++)
{
if(f[i]==i)
{
ans+=max(max1[i],max2[i]);
}
}
return ans;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
sort(p,p+n,cmp);
printf("%d\n",ok(n));
}
return 0;
}

  

Fzu oj2194星系碰撞(排序+并查集+路径压缩)的更多相关文章

  1. 并查集+路径压缩(poj1988)

    http://poj.org/problem?id=1988 Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submiss ...

  2. hdu 1558 线段相交+并查集路径压缩

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction

    http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...

  4. 并查集 + 路径压缩(经典) UVALive 3027 Corporative Network

    Corporative Network Problem's Link Mean: 有n个结点,一开始所有结点都是相互独立的,有两种操作: I u v:把v设为u的父节点,edge(u,v)的距离为ab ...

  5. HDU 3635 并查集+路径压缩+记录每个点移动次数

    题意: 给定n个点 oper个操作 每个点有1个龙珠 下面2种操作: T u v 把u点所有龙珠搬到v Q u  问u点当前所在城市 u点所在城市有几个龙珠 u点被移动几次 思路: 并查集可以求出 u ...

  6. HDOJ 3635 并查集- 路径压缩,带秩合并

    思路来源:http://blog.csdn.net/niushuai666/article/details/6990421 题目大意: 初始时,有n个龙珠,编号从1到n,分别对应的放在编号从1到n的城 ...

  7. LA 并查集路径压缩

    题目大意:有n个节点,初始时每个节点的父亲节点都不存在.有两种操作 I u v:把点节点u的父亲节点设为v,距离为|u-v|除以1000的余数.输入保证执行指令前u没有父亲节点. E u:询问u到根节 ...

  8. POJ 1988 Cube Stacking(并查集+路径压缩)

    题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的 ...

  9. snnu(1110) 传输网络 (并查集+路径压缩+离线操作 || 线段树)

    1110: 传输网络 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 43  Solved: 18[Submit][Status][Web Board] ...

随机推荐

  1. 7添加一个“X”到HTML:转到XHTML

    XHTML中的X代表extensible,是以XML为基础的另一种说法.XML表示可扩展的标记语言. XML是一种可以用来开发新的标记语言的语言,而HTML只是一门标记语言. HTML转化为XHTML ...

  2. url如何传递参数

    $(document).ready(function() { var name=getQueryString('minename'); if (name != null && name ...

  3. 一个比较轻巧好用的js分页插件,可ajax可url

    var pageNav = pageNav || {}; pageNav.fn = null; pageNav.pre = "pre"; pageNav.next = " ...

  4. JavaScript操作数组

    数组被描述为一个存储元素的线性集合,元素可以通过索引来任意存取. 几乎所有的编程语言都有类似的数据结构,但是Javascript中的数组却略有不同. Javascript中的数组是一种特殊的对象,所以 ...

  5. SQLAlchemy 一对多

    下述範例描述了電影同導演的多對一關係.範例中說明了從用戶定義的Python類建立數據表的方法,雙方關係例項的建立方法,以及最終查詢數據的方法:包括延遲載入和預先載入兩種自動生成的SQL查詢. 結構定義 ...

  6. 用facebook账号登陆到你的Magento网店

    Inchoo提供magento和facebook连接的扩展,可以到http://inchoo.net/ecommerce/magento/facebook-connect-magento-extens ...

  7. Chrome 文件另存为和打开本地资源时会卡死的问题

    一般是第一次可以 第二次以后就会卡死 另存为问题:弹出窗口没有正常弹出实际已经存在 直接按“回车”下载即可 上传时的问题:如果卡死 可以点击“ESC” 取消操作 解决卡死 但是无法上传了 有人知道原因 ...

  8. sell-- 英文网站产品显示404?

    1. 简介: 通过在主页(header.jsp)查询B22212,在localhost本地, cn和us查询的结果search.jsp中显示都是没有找到! 但是在外网(www),cn能够查询到,并展示 ...

  9. JavaScript:综合案例---房贷计算器的实现

    房贷计算器的实现 (可以使用的编辑器:webStrom.subLime.notePad++.editPlus) 输入数据: 平方单价 70,000.00 元/平方  B1 租金 382.50 元/平方 ...

  10. C语言:通过返回指针的形式找出数组的最大值和最小值

    // //  main.c //  Pointer_max_min(return) // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年 ...