HDU 5721Palace
来源:互联网 发布:知乎那些曾经轰动一时 编辑:程序博客网 时间:2024/06/06 06:47
Palace
Accepts: 28
Submissions: 307
Time Limit: 8000/4000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
问题描述
为了寻找失去的爱人Cupid,Psyche需要完成Venus的最后一项任务:前往冥界,收集一盒冥界皇后Prosperina的美貌。冥界有n个神殿,可以表示为平面上的n个整点。Psyche想要找到这n座神殿中,最近的两座神殿之间的距离。传说那就是通往主殿的密码。但是冥界神秘莫测,在不同的时刻,这n座神殿中的某一座会消失。Psyche想要知道,对于n座神殿中的任意一座消失的情况,最近的两座神殿之间的距离。你只需要输出它们的和。为避免精度误差,定义两点(x1,y1),(x2,y2)间的距离为d=(x1−x2)2+(y1−y2)2。
输入描述
第一行,一个整数T (1≤T≤5),代表数据组数。对于每组数据,第一行,一个整数n (3≤n≤105),代表神殿个数。下面n行,每行两个整数x,y (−105≤x,y≤105),代表神殿的位置在(x,y)。注意可能存在两座神殿坐落在同一位置。
输出描述
输出T行,对于每组数据,输出n座神殿中的任意一座消失的情况,最近两座神殿之间的距离的和。
输入样例
130 01 12 2
输出样例
12
Hint
神殿(0,0)消失时,d=(1−2)2+(1−2)2=2;神殿(1,1)消失时,d=(0−2)2+(0−2)2=8;神殿(2,2)消失时,d=(0−1)2+(0−1)2=2;故答案为2+8+2=12。
解题思路:
感觉就是很裸的平面最近点对的模板题= =题解上的说的也很明确了,只有三种情况
一种情况是删的点不属于最近点对里面的点
剩下两种情况各删的最近点对里面的其中一点
代码如下:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define INF 1e18#define Min(a, b) ((a) <= (b) ? (a) : (b))typedef long long LL;typedef struct node{ LL x, y; LL index;}Coord;const int maxn = 1e5 + 5;LL p1, p2, ans;Coord p[maxn], ppp[maxn], tmp[maxn];inline LL f(LL x){ return (x >= 0 ? x : -x);}inline bool cmp(Coord a, Coord b){ return a.x < b.x;}inline bool cmp2(Coord a, Coord b){ return a.y < b.y;}inline LL Dist(Coord a, Coord b){ return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);}LL Cal_Closest(LL left, LL right, int step){ LL d = INF; if(left == right){ return d; } if(left + 1 == right){ LL tmp2 = Dist(p[left], p[right]); if(step == 0){ if(step == 0 && tmp2 < ans){ p1 = left; p2 = right; ans = tmp2; } } return tmp2; } LL mid = (left + right) >> 1; LL d1 = Cal_Closest(left, mid, step); LL d2 = Cal_Closest(mid + 1, right, step); d = Min(d1, d2); LL k = 0; for(LL i = left; i <= right; ++i){ if(f(p[mid].x - p[i].x) <= d){ tmp[k++] = p[i]; } } sort(tmp, tmp + k, cmp2); for(LL i = 0; i < k; ++i){ for(LL j = i + 1; j < k && tmp[j].y - tmp[i].y < d; ++j){ if(d > Dist(tmp[i], tmp[j])){ d = Dist(tmp[i], tmp[j]); if(step == 0 && d < ans){ p1 = tmp[i].index; p2 = tmp[j].index; ans = d; } } } } return d;}int main(){ LL t, n; scanf("%lld", &t); while(t--){ scanf("%lld", &n); memset(p, 0, sizeof(p)); memset(ppp, 0, sizeof(ppp)); for(LL i = 0; i < n; ++i){ scanf("%lld%lld", &p[i].x, &p[i].y); } sort(p, p + n, cmp); for(LL i = 0; i < n; ++i) p[i].index = i; for(LL i = 0; i < n; ++i) ppp[i] = p[i]; p1 = 0; p2 = 0; ans = INF; ans = Cal_Closest(0, n - 1, 0); ans = ans * (n - 2); LL t = 0; for(LL i = 0; i < n; ++i){ if(ppp[i].index == p1) continue; p[t++] = ppp[i]; } sort(p, p + t, cmp); ans += Cal_Closest(0, t - 1, 1); t = 0; for(LL i = 0; i < n; ++i){ if(ppp[i].index == p2) continue; p[t++] = ppp[i]; } sort(p, p + t, cmp); ans += Cal_Closest(0, t - 1, 1); printf("%lld\n", ans); } return 0;}
0 0
- HDU 5721 Palace
- HDU 5721Palace
- HDU-5721 Palace(最接近点问题 分治)
- HDU 5721 Palace 平面最近点对
- 【HDU 5721】Palace(平面最近点对)
- HDU 5721 Palace(平面最近点对(分治))
- HDU 5721 Palace BestCoder 2nd Anniversary (平面最近点对)
- HDU 5128 The E-pang Palace
- HDU 5128 The E-pang Palace
- HDU.5128 The E-pang Palace
- HDU 5128 The E-pang Palace(枚举,几何)
- HDU 5128 The E-pang Palace(暴力)
- HDU 5128 The E-pang Palace(暴力瞎搞)
- hdu 5128 The E-pang Palace(几何暴力)
- HDU 5128 The E-pang Palace(暴力)
- hdu 5128 The E-pang Palace 大力判矩形相交
- hdu 5128 The E-pang Palace(计算几何:暴力枚举)
- hdu 5128 The E-pang Palace (计算几何+暴力枚举)
- WScript.Shell创建失败
- iOS-自定义TabBar
- ubuntu16.04安装jdk并配置
- 使用Cookie进行会话管理
- 学习笔记:ListView应用,分块右侧导航的简单分析
- HDU 5721Palace
- UVA 10943 HOW do you add?
- 【杭电oj】1013 - Digital Roots(数论 - 九余定理,好题)
- 属性动画步骤总结——包含xml实现与java代码实现
- CDN
- Git 入门 ---- Git 常用命令
- java-----hashCode和equals的区别
- 代码:一种类似outlook资源树的CSS样式
- 死锁浅析