题目链接:

Palace

Time Limit: 8000/4000 MS (Java/Others)  

  Memory Limit: 262144/262144 K (Java/Others)

Problem Description
The last trial Venus imposes on Psyche is a quest to the underworld. She is to take a box and obtain in it a dose of the beauty of Prosperina, queen of the underworld.

There are n palaces in the underworld, which can be located on a 2-Dimension plane with (x,y) coordinates (where x,y are integers). Psyche would like to find the distance of the closest pair of two palaces. It is the password to enter the main palace.

However, the underworld is mysterious and changes all the time. At different times, exactly one of the n palaces disappears.

Psyche wonders what the distance of the closest pair of two palaces is after some palace has disappeared.

Print the sum of the distance after every single palace has disappeared.

To avoid floating point error, define the distance d between palace (x1,y1) and (x2,y2) as d=(x1−x2)2+(y1−y2)2.

 
Input
The first line of the input contains an integer T (1≤T≤5), which denotes the number of testcases.

For each testcase, the first line contains an integers n (3≤n≤105), which denotes the number of temples in this testcase.

The following n lines contains n pairs of integers, the i-th pair (x,y) (−105≤x,y≤105) denotes the position of the i-th palace.

 
Output
For each testcase, print an integer which denotes the sum of the distance after every single palace has disappeared.
 
Sample Input
1
3
0 0
1 1
2 2
 
Sample Output
12
 
题意:
 
给定n个点,每次删除一个点,问剩下的最近点对距离和是多少;
 
思路:
 
先找一遍最近点对的两个点,删除其他n-2个点对最近点对没有影响,然后再分别删除最近点对的这两个点,再最近点对的距离,最后把这些加起来就好了;
 
AC代码:
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map> using namespace std; #define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss)); typedef long long LL; template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
if(!p) { puts("0"); return; }
while(p) stk[++ tp] = p%10, p/=10;
while(tp) putchar(stk[tp--] + '0');
putchar('\n');
} const LL mod=998244353;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e5+10;
const int maxn=1e3+10;
const double eps=1e-6; struct node
{
LL x,y;
}po[N],temp[N],po1[N];
int cmp1(node a,node b)
{
return a.x<b.x;
}
int cmp2(node a,node b)
{
return a.y<b.y;
}
node fa,fb;
LL ans;
LL get_dis(node a, node b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
LL merge(int l,int r)
{
if(r-l<=1)
{
if(l==r)return inf;
else
{
LL dis=get_dis(po[l],po[r]);
if(dis<ans)
{
fa=po[l];
fb=po[r];
ans=dis;
}
return dis;
}
} int mid=(l+r)>>1;
LL dl=merge(l,mid),dr=merge(mid+1,r),d=min(dl,dr);
int cnt=0;
For(i,l,r)
{
if(abs(po[mid].x-po[i].x)<=d)temp[++cnt]=po[i];
}
sort(temp+1,temp+cnt+1,cmp2);
For(i,1,cnt)
{
for(int j=i+1;j<=cnt&&temp[j].y-temp[i].y<d;j++)
{
LL dis=get_dis(temp[j],temp[i]);
if(dis<d)d=dis;
if(dis<ans)
{
ans=dis;
fa=temp[j];
fb=temp[i];
}
}
}
return d;
} LL work(int l,int r)
{
ans=inf;
sort(po+l,po+r+1,cmp1);
return merge(l,r);
}
int main()
{
int t;
read(t);
while(t--)
{
int n;
read(n);
For(i,1,n)read(po1[i].x),read(po1[i].y),po[i]=po1[i]; LL sum=0;
sum+=work(1,n)*(LL)(n-2);
node faa=fa,fbb=fb;
int flag=0;
For(i,1,n)
{
if(po1[i].x==faa.x&&po1[i].y==faa.y&&flag==0)
{
flag=1;
po[i].x=1e7;
po[i].y=1e7;
continue;
}
po[i]=po1[i];
}
sum+=work(1,n);
flag=0;
For(i,1,n)
{
if(po1[i].x==fbb.x&&po1[i].y==fbb.y&&flag==0)
{
flag=1;
po[i].x=1e7;
po[i].y=1e7;
continue;
}
po[i]=po1[i];
}
sum+=work(1,n);
cout<<sum<<"\n";
} return 0;
}

  

hdu-5721 Palace(最近点对)的更多相关文章

  1. HDU 1007Quoit Design(最近点问题)

    最近点问题:二维平面中有n(n很大)个点,求出距离最近的两个点 思路:因为n的值很大,所以暴力和dp都行不通了吧!分治法就挺好的. 将区间一半一半的分开,直到分成只有一个点或两个点的时候! 对于只有两 ...

  2. hdu 4631(最近点对,容器)

    点击打开链接 题意: 给你一个平面,每次加入一个点,当点数>=2时,求最近点对距离的平方,最后输出所有的平方和. 给你a,b,c x[0]=0;x[i]=(x[i-1]*a+b)%c 如果按照平 ...

  3. Hdu 1007 最近点对

    题目链接 Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. HDU 1007 Quoit Design(经典最近点对问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

  5. HDU 5218 The E-pang Palace (简单几何—2014广州现场赛)

    题目链接:pid=5128">http://acm.hdu.edu.cn/showproblem.php? pid=5128 题面: The E-pang Palace Time Li ...

  6. HDU 4631 Sad Love Story 平面内最近点对

    http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意: 在平面内依次加点,求每次加点后最近点对距离平方的和 因为是找平面最近点对...所以加点以后这个最短 ...

  7. HDU 1007 Quoit Design 平面内最近点对

    http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...

  8. HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128 解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不 ...

  9. hdu 5128 The E-pang Palace

    http://acm.hdu.edu.cn/showproblem.php?pid=5128 题意:给定N个点,选出其中8个点组成两个矩形,使得两个矩形的面积和最大. 思路:找出所有的矩形,然后枚举, ...

随机推荐

  1. scanf printf函数返回值

    1. scanf 函数是有返回值的,它的返回值可以分成三种情况  1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b);   ...

  2. Linux设置文件与Shell操作环境

    Shell设置文件读取流程 /etc/shells记录了Linux系统中支持的所有shell,默认使用bash.用户登入Linux系统时会获取到一个shell,具体获取到哪个shell与登录账号有关, ...

  3. linux下将目录授权给其他用户的步骤

    1.更改目录所有者命令:chown -R 用户名称 目录名称2.更改目录权限命令:chmod -R 755 目录名称

  4. vue之组件注册

    一.组件名 写组件之前你要明确你的目的,想要做一个什么样的组件,我们在注册一个组件的时候,需要给组件一个名字,对于命名,尽可能明确,使用 kebab-case (短横线分隔命名) 或 PascalCa ...

  5. 转:c++ 11 新特性

    声 明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的<The Biggest Changes in C++11(and Why You Should Care)&g ...

  6. Linux查看系统状态命令top

    用法 top 自动刷新系统状态,要结束使用[Ctrl]+[C] 效果图: 信息解释(转自百度经验http://jingyan.baidu.com/article/4d58d5412917cb9dd4e ...

  7. 什么场景应该用 MongoDB ?

    摘要: 月初在云栖社区上发起了一个 MongoDB 使用场景及运维管理问题交流探讨 的技术话题,有近5000人关注了该话题讨论,这里就 MongoDB 的使用场景做个简单的总结,谈谈什么场景该用 Mo ...

  8. Andriod DiskLruCache的使用案例

    DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,本案例将对DiskLruCache的基本用法做一个总结,包括:创建缓存.查找使用缓存.移除缓存等等. 实现效果图 创建DiskLruCache ...

  9. 【转载】轻松搞懂WebService工作原理

    用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助. WebService是基于网络的.分布式的模块化组件. 我们直接来看WebService的一个简易工作流程: ...

  10. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...