HDU 5992 Finding Hotels KDtree
来源:互联网 发布:网络维护培训资料 编辑:程序博客网 时间:2024/05/19 14:50
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5992
题意:给出n个酒店,每个酒店有一个花费和坐标。然后给出m个询问,输出离询问最近并且花费在询问要求内的酒店。
解法:第一个想法是两种东西按照花费排序,每次插入新酒店。但是这个插入比较麻烦,在kdtree退化的时候需要及时重构(套个替罪羊树啥的)。 还有一种就是直接建三维kdtree,然后对于每一个询问,如果一个节点范围内最小第三维比询问大,那么可以直接忽略。计算的时候只要算上两维的距离即可。(似乎这样比较慢的)。
#include <bits/stdc++.h>using namespace std;const int maxn = 200010;typedef long long LL;const LL inf = 1e18;LL n, m, D, root;struct node{ LL l, r, d[3], mx[3], mi[3], c, id;}a[maxn];bool cmp(node x, node y){ return x.d[D] < y.d[D];}void up(LL k, LL s){ for(LL i=0; i<3; i++){ a[k].mi[i] = min(a[k].mi[i], a[s].mi[i]); a[k].mx[i] = max(a[k].mx[i], a[s].mx[i]); }}LL build(LL l, LL r, LL dd){ D=dd;LL mid=(l+r)/2; nth_element(a+l+1,a+mid+1,a+r+1,cmp); for(LL i=0; i<3; i++) a[mid].mi[i]=a[mid].mx[i]=a[mid].d[i]; if(l!=mid) a[mid].l=build(l,mid-1,(dd+1)%3);else a[mid].l=0; if(mid!=r) a[mid].r=build(mid+1,r,(dd+1)%3);else a[mid].r=0; if(a[mid].l) up(mid,a[mid].l); if(a[mid].r) up(mid,a[mid].r); return mid;}LL Sqr(LL x){ return x*x;}LL x,y,z,ans,dis;LL getdis(LL p){ LL res=0; if(z<a[p].mi[2]) return inf; if(x>a[p].mx[0]) res+=Sqr(x-a[p].mx[0]); if(x<a[p].mi[0]) res+=Sqr(a[p].mi[0]-x); if(y>a[p].mx[1]) res+=Sqr(y-a[p].mx[1]); if(y<a[p].mi[1]) res+=Sqr(a[p].mi[1]-y); return res;}void ask(LL p){ LL dl,dr,d0=0; if(a[p].d[2]>z) d0=inf; if(d0==0){ d0+=Sqr(a[p].d[0]-x)+Sqr(a[p].d[1]-y); if(d0<dis){ dis=d0; ans=p; }else if(d0==dis){ if(a[p].id<a[ans].id){ ans=p; } } } if(a[p].l) dl=getdis(a[p].l);else dl=inf; if(a[p].r) dr=getdis(a[p].r);else dr=inf; if(dl<dr){if(dl<=dis)ask(a[p].l);if(dr<=dis)ask(a[p].r);} else{if(dr<=dis)ask(a[p].r);if(dl<=dis)ask(a[p].l);}}int main(){ LL T; scanf("%lld", &T); while(T--){ scanf("%lld%lld", &n,&m); for(LL i=1; i<=n; i++){ for(LL j=0;j<3;j++) scanf("%lld", &a[i].d[j]); a[i].l=a[i].r=0; a[i].id=i; } root=build(1, n, 0); for(LL i=1; i<=m; i++){ scanf("%lld%lld%lld", &x,&y,&z); dis=inf; ans=-1; ask(root); printf("%lld %lld %lld\n",a[ans].d[0],a[ans].d[1],a[ans].d[2]); } } return 0;}
阅读全文
0 0
- HDU 5992 Finding Hotels KDtree
- HDU 5992 Finding Hotels KDtree
- HDU 5992 Finding Hotels
- 【22.95%】【hdu 5992】Finding Hotels
- HDU 5992 Finding Hotels(KD-Tree)
- [KD 树]HDU 5992 Finding Hotels
- 【HDOJ】5992 Finding Hotels
- HDU5992-Finding Hotels
- HDU 5992 (kdtree)
- HDU5992 Finding Hotels(Kd-tree)
- UVALive 7744 Finding Hotels(kd tree)
- hdu 4347 kdtree kdtree+优先队列
- HDU 4400-Mines-KDtree
- HDU 4347 KNN+KDTree
- HDU 2966 KDtree模板
- HDU 5126 stars KDTree
- kdtree
- kdTree
- Wagby勉強資料
- idea热部署内存溢出:java.lang.OutOfMemoryError: PermGen space
- leetcode第二题AddTwoNumber
- hdu1716粘结答案处,hdu怎么总是打不开
- 天天快递
- HDU 5992 Finding Hotels KDtree
- DDL-操作数据表
- iOS 多任务下载(支持离线
- HDU4452 Running Rabbits(模拟)
- Map集合遍历
- 请写出 float x 与“零值”比较的 if 语句(面试题)
- 中国科学院微生物研究所——人类肠道微生物2016年文章精选
- hdu 3966 Aragorn's Story(树链剖分)
- 数据结构第二周项目-C++参数传递的三种方式