2626: JZPFAR K-D tree
2016-05-21 23:45
387 查看
裸题,用堆维护一下。
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> using namespace std; const int N=100005; const int INF=1000000007; int n,D,root; int ls ,rs ; struct node { int d[2],mn[2],mx[2]; int id; inline int& operator[](int x) { return d[x]; } }tree ,p; struct W { long long val; int id; W () {}; W (long long _,int __) {val=_; id=__;} }; inline bool operator<(W a,W b) { return a.val==b.val?a.id<b.id:a.val>b.val; } priority_queue<W> q; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } inline bool operator<(node a,node b) { return a[D]==b[D]?a[D^1]<b[D^1]:a[D]<b[D]; } inline void pushup(int k) { for (int i=0;i<=1;i++) { tree[k].mn[i]=min(tree[k].mn[i],min(tree[ls[k]].mn[i],tree[rs[k]].mn[i])); tree[k].mx[i]=max(tree[k].mx[i],max(tree[ls[k]].mx[i],tree[rs[k]].mx[i])); } } void build(int &k,int l,int r,int dir) { int mid=l+r>>1; k=mid; D=dir; nth_element(tree+l,tree+mid,tree+r+1); tree[mid].mn[0]=tree[mid].mx[0]=tree[mid][0]; tree[mid].mn[1]=tree[mid].mx[1]=tree[mid][1]; if (l<mid) build(ls[k],l,mid-1,dir^1); if (r>mid) build(rs[k],mid+1,r,dir^1); pushup(k); } inline long long sqr(int x) { return (long long)x*x; } inline long long dis(node a,node b) { return (long long)sqr(a[0]-b[0])+(long long)sqr(a[1]-b[1]); } inline long long getdis(int x) { if (!x) return -2; long long ans=0; for (int i=0;i<=1;i++) ans+=max((long long)sqr(tree[x].mx[i]-p[i]),(long long)sqr(tree[x].mn[i]-p[i])); return ans; } void query(int k) { if (!k) return; long long dl=getdis(ls[k]),dr=getdis(rs[k]),d=dis(p,tree[k]); if (d>q.top().val||(d==q.top().val&&tree[k].id<q.top().id)) { q.pop(); q.push(W(d,tree[k].id)); } if (dl>dr) { if (dl>=q.top().val) query(ls[k]); if (dr>=q.top().val) query(rs[k]); } else { if (dr>=q.top().val) query(rs[k]); if (dl>=q.top().val) query(ls[k]); } } int main() { n=read(); tree[0].mn[0]=tree[0].mn[1]=INF; tree[0].mx[0]=tree[0].mx[1]=-INF; for (int i=1;i<=n;i++) tree[i][0]=read(),tree[i][1]=read(),tree[i].id=i; build(root,1,n,1); int testcase=read(); while (testcase--) { while (!q.empty()) q.pop(); p[0]=read(); p[1]=read(); int k=read(); for (int i=1;i<=k;i++) q.push(W(-1,0)); query(root); printf("%d\n",q.top().id); } return 0; }
相关文章推荐
- ORA-01280: Fatal LogMiner Error解决方法
- 动态规划 ——总结.
- 从技术实现角度看Android UI设计
- UVa 310 - L--system
- JAVA中堆和栈的区别
- AngularJS $route路由
- 4565: [Haoi2016]字符合并 区间DP
- 深入浅出UML类图---写得不错,备忘
- 学习经历之格式篇
- leetcode #20 in cpp
- 人生四然:来是偶然,去是必然,尽其当然,顺其自然!
- findreplace Matlab 脚本
- 一道JAVA面试题(匿名内部类)
- 软件设计----LisKov替换原则(LSP)
- 4566: [Haoi2016]找相同字符 广义后缀自动机
- Learning Handler
- 1001
- AIX 6.1 11g RAC数据库怎样改网段
- --pl/sql包,游标,存储过程,块
- 内存溢出及Jvm监控工具