您的位置:首页 > 其它

Bzoj2626:JZPFAR:K-D-Tree

2016-06-09 20:11 267 查看
题目链接:JZPFAR

K-D_Tree复习,直接忘记了写point的比较函数导致nth_element出错调了好久QAQ

#include<queue>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=100010;
struct qqq{LL dis; int id;};
bool operator < (qqq a,qqq b){
return a.dis>b.dis||(a.dis==b.dis&&a.id<b.id);
}
priority_queue<qqq>q;

int D;
struct point{int d[2],mx[2],mn[2],l,r,id;}p[maxn],qu;
bool operator < (const point &a,const point &b){
return a.d[D]<b.d[D];
}

int n,m,K,root;
struct k_d_tree{
int ans;
point t[maxn],T;
void update(int k){
point l=t[t[k].l],r=t[t[k].r];
for (int i=0;i<=1;++i){
t[k].mn[i]=t[k].mx[i]=t[k].d[i];
if (t[k].l) t[k].mn[i]=min(t[k].mn[i],l.mn[i]),
t[k].mx[i]=max(t[k].mx[i],l.mx[i]);
if (t[k].r) t[k].mn[i]=min(t[k].mn[i],r.mn[i]),
t[k].mx[i]=max(t[k].mx[i],r.mx[i]);
}
}
int build(int l,int r,int now){
D=now; int mid=(l+r)>>1;
nth_element(p+l,p+mid,p+r+1);
t[mid]=p[mid];
for (int i=0;i<=1;++i) t[mid].mn[i]=t[mid].mx[i]=t[mid].d[i];
if (l<mid) t[mid].l=build(l,mid-1,now^1);
if (mid<r) t[mid].r=build(mid+1,r,now^1);
update(mid); return mid;
}
LL powe(int x){return 1LL*x*x;}
LL calc(int x){
if (!x) return -2;
LL ret=0;
for (int i=0;i<=1;++i)
ret+=max(powe(t[x].mx[i]-qu.d[i]),powe(t[x].mn[i]-qu.d[i]));
return ret;
}
LL qdis(point a,point b){
LL ret=0;
for (int i=0;i<=1;++i) ret+=powe(a.d[i]-b.d[i]);
return ret;
}
void query(int x){
if (!x) return;
LL dl=calc(t[x].l),dr=calc(t[x].r),dis=qdis(t[x],qu);
if (dis>q.top().dis||(dis==q.top().dis&&t[x].id<q.top().id)) q.pop(),q.push((qqq){dis,t[x].id});
if (dl>dr){
if (dl>=q.top().dis) query(t[x].l);
if (dr>=q.top().dis) query(t[x].r);
}else{
if (dr>=q.top().dis) query(t[x].r);
if (dl>=q.top().dis) query(t[x].l);
}
}
}kdt;

int main(){
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d%d",&p[i].d[0],&p[i].d[1]),p[i].id=i;
root=kdt.build(1,n,0);
scanf("%d",&m);
for (int i=1;i<=m;++i){
scanf("%d%d%d",&qu.d[0],&qu.d[1],&K);
while (!q.empty()) q.pop();
for (int i=1;i<=K;++i) q.push((qqq){-1,0});
kdt.query(root);
printf("%d\n",q.top().id);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BZOJ K-D-Tree