求调k-D Tree领域查询
查看原帖
求调k-D Tree领域查询
401052
Endline楼主2023/7/1 11:14

rt,题意是求距离给出点第 kk 远的点的编号

但是测试点全WA了

#include<bits/stdc++.h>
#define MAXN 100002
#define MAXM 10002
#define int long long
using namespace std;
namespace FastIO
{
	char buf[1<<23],*p1,*p2;
	#define reg register
	#ifdef ONLINE_JUDGE
	#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<22,stdin),p1==p2))?EOF:*p1++
	#else
	#define gc() getchar()
	#endif
	inline int read()
    {
        reg int f=1,w=0;reg char ch=gc();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
        while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=gc();
        return f*w;
    }
}
using FastIO::read;
int n,m;
int ls[MAXN],rs[MAXN];
int L[MAXN],R[MAXN],D[MAXN],U[MAXN];
struct point
{
	int x,y;
	point(int _x,int _y){x=_x,y=_y;}
	point(){}
}p[MAXN];
struct node
{
	int id;
	int dis;
	node(int _id,int _dis){id=_id,dis=_dis;}
	node(){}
};
inline bool operator<(node a,node b)
{
	return a.dis>b.dis||(a.dis==b.dis&&a.id<b.id);
}
priority_queue<node>q;
inline int dis(point a,point b)
{
	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
inline void maintain(int x)
{
	L[x]=R[x]=p[x].x,D[x]=U[x]=p[x].y;
	if(ls[x])
	{
		L[x]=min(L[x],L[ls[x]]),R[x]=max(R[x],R[ls[x]]);
		D[x]=min(D[x],D[ls[x]]),U[x]=max(U[x],U[ls[x]]);
	}
	if(rs[x])
	{
		L[x]=min(L[x],L[rs[x]]),R[x]=max(R[x],R[rs[x]]);
		D[x]=min(D[x],D[rs[x]]),U[x]=max(U[x],U[rs[x]]);
	}
	return;
}
inline int build(int l,int r)
{
	if(l>r)return 0;
	if(l==r)
	{
		maintain(l);
		return l;
	}
	int mid=l+r>>1;
	double avx=0,avy=0,vax=0,vay=0;
	for(int i=l;i<=r;i++)
		avx+=p[i].x,avy+=p[i].y;
	avx/=r-l+1,avy/=r-l+1;
	for(int i=l;i<=r;i++)
		vax+=(p[i].x-avx)*(p[i].x-avx),vay+=(p[i].y-avy)*(p[i].y-avy);
	if(vax>=vay)nth_element(p+l,p+mid,p+r+1,[](point a,point b){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;});
	else nth_element(p+l,p+mid,p+r+1,[](point a,point b){if(a.y!=b.y)return a.y<b.y;return a.x<b.x;});
	ls[mid]=build(l,mid-1);
	rs[mid]=build(mid+1,r);
	maintain(mid);
	return mid;
}
inline int eval(point a,int x)
{
	int res=0;
	res=max(res,dis(a,point(L[x],D[x])));
	res=max(res,dis(a,point(L[x],U[x])));
	res=max(res,dis(a,point(R[x],D[x])));
	res=max(res,dis(a,point(R[x],U[x])));
	return res;
}
inline void query(int l,int r,point x)
{
	if(l>r)return;
	int mid=l+r>>1;
	if(dis(p[mid],x)>q.top().dis||(dis(p[mid],x)==q.top().dis&&mid<q.top().id))
	{
		q.pop();
		q.push(node(mid,dis(p[mid],x)));
	}
	if(l==r)return;
	int lval=eval(x,ls[mid]),rval=eval(x,rs[mid]);
	if(lval>=q.top().dis&&rval>=q.top().dis)
	{
		if(lval>rval)
		{
			query(l,mid-1,x);
			query(mid+1,r,x);
		}
		else
		{
			query(mid+1,r,x);
			query(l,mid-1,x);
		}
	}
	else
	{
		if(lval>=q.top().dis)query(l,mid-1,x);
		if(rval>=q.top().dis)query(mid+1,r,x);
	}
	return;
}
signed main()
{
	// freopen("test.in","r",stdin);
	// freopen("test.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)
		p[i].x=read(),p[i].y=read();
	build(1,n);
	m=read();
	for(int i=1;i<=m;i++)
	{
		int px=read(),py=read(),k=read();
		while(!q.empty())q.pop();
		for(int j=1;j<=k;j++)q.push(node(-1,0));
		query(1,n,point(px,py));
		printf("%lld\n",q.top().id);
	}
	return 0;
}
2023/7/1 11:14
加载中...