HDU 5721 Palace(平面最近点对(分治))
来源:互联网 发布:tfboys官方周边淘宝店 编辑:程序博客网 时间:2024/06/05 01:07
http://acm.hdu.edu.cn/showproblem.php?pid=5721
n个点,去掉一个点的情况下,最近距离平方之和。
平面最近点对模版题,先求出最近距离,然后找到是哪两个点,然后这个距离乘以n-2 ,然后枚举去掉两个点中的一个,再求平面最近距离,做3次即可,用stl很方便QAQ,记录是哪两个点的时候直接记录坐标,因为中间有排序,记录编号没用。
代码:
#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <string>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <sstream>#include <cstdlib>#include <iostream>#include <algorithm>#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;#define MAX 100005#define MAXN 1000005#define maxnode 15#define sigma_size 30#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define lrt rt<<1#define rrt rt<<1|1#define middle int m=(r+l)>>1#define LL long long#define ull unsigned long long#define mem(x,v) memset(x,v,sizeof(x))#define lowbit(x) (x&-x)#define pii pair<int,int>#define bits(a) __builtin_popcount(a)#define mk make_pair#define limit 10000//const int prime = 999983;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f;const double pi = acos(-1.0);const double inf = 1e18;const double eps = 1e-4;const LL mod = 1e9+7;const ull mx = 133333331;/*****************************************************/inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; }/*****************************************************/pii a[MAX],b[MAX],c[MAX];bool cmp(pii x,pii y){ return x.second<y.second;}pair<LL,pair<pii,pii> > closest_pair(pii *A,int n){ if(n<=1) return mk(1e18,mk(mk(0,0),mk(0,0))); int m=n/2; int x=A[m].first; pair<LL,pair<pii,pii> > d=min(closest_pair(A,m),closest_pair(A+m,n-m)); inplace_merge(A,A+m,A+n,cmp); vector<pii> b; for(int i=0;i<n;i++){ if(((LL)A[i].first-x)*((LL)A[i].first-x)>=d.first) continue; for(int j=0;j<b.size();j++){ LL dx=A[i].first-b[b.size()-1-j].first; LL dy=A[i].second-b[b.size()-1-j].second; if(dy*dy>=d.first) break; d=min(d,mk(dx*dx+dy*dy,mk(A[i],b[b.size()-1-j]))); } b.push_back(A[i]); } return d;}int main(){ //freopen("in.txt","r",stdin); int t; cin>>t; while(t--){ int n; cin>>n; for(int i=0;i<n;i++){ int x,y; scanf("%d%d",&x,&y); a[i]=mk(x,y); } LL ans=0; sort(a,a+n); pair<LL,pair<pii,pii> > p=closest_pair(a,n); ans+=(LL)(n-2)*p.first; int tot=0; int flag=0; for(int i=0;i<n;i++){ if(a[i]==p.second.first&&!flag){ flag=1;continue; } b[tot++]=a[i]; } sort(b,b+tot); pair<LL,pair<pii,pii> > q=closest_pair(b,tot); tot=0; ans+=q.first; flag=0; for(int i=0;i<n;i++){ if(a[i]==p.second.second&&!flag){ flag=1;continue; } c[tot++]=a[i]; } sort(c,c+tot); q=closest_pair(c,tot); ans+=q.first; cout<<ans<<endl; } return 0;}
0 0
- HDU 5721 Palace(平面最近点对(分治))
- 【HDU 5721】Palace(平面最近点对)
- HDU 5721 Palace 平面最近点对
- HDU 5721 Palace BestCoder 2nd Anniversary (平面最近点对)
- hdu 1007 平面最近点对 分治
- 【HDU5721 BestCoder 2nd AnniversaryD】【平面最近点对 分治写法+KD-tree写法】Palace 平面最近点对
- hdu1007 Quoit Design 平面最近点对(分治)
- HDU-5721 Palace(最接近点问题 分治)
- 最近点对 (分治)
- 最近点对(分治)
- 分治法:平面最近点对问题
- 算法 分治 平面最近点对
- HDU 1007 平面最近点对(计算集几何)
- hdu 1007 经典最近点对 (分治法求解)
- hdu 1007 Quoit Design(分治求最近点对)
- hdu 1007 Quoit Design 最近点对(分治)
- 分治法(最近点对)——HDU 1007
- hdu(1007) 最近点对 分治法
- HDU 5543 Pick The Sticks(DP)
- Android 人脸检测
- 汉诺塔-java
- 【HDU1176】免费馅饼(类数塔问题)
- 类加载机制_双亲委派模型
- HDU 5721 Palace(平面最近点对(分治))
- ORACLE OEM
- webmagic入门
- Error code 2: Access violation的错误.
- android检查更新(强制更新)
- 典型DAO的模板
- Spring 学习
- HDU 5545 The Battle of Guandu(最短路)
- HDU1269 强连通Tarjan