0 分全 T 求调
查看原帖
0 分全 T 求调
576074
123asdf123楼主2024/6/12 10:44

RT

#include<bits/stdc++.h>
using namespace std;
namespace estidi{
	long long pw2(long long x){
		return x*x;
	}
	long long dis(long long fx,long long fy,long long sx,long long sy){
		return pw2(fx-sx)+pw2(fy-sy);
	}
	long long maxdis(long long fx,long long fy,long long sx,long long sy,long long px,long long py){
		return pw2(max(abs(py-fy),abs(py-sy)))+pw2(max(abs(px-fx),abs(px-sx)));
	}
	struct node{
		int x,y,ls,rs,minx,maxx,miny,maxy;
	}a[100003];
	int b[100003],px,py,k;
	struct num{
		int id;
		long long v;
	};
	bool operator < (num a,num b){
		if(a.v==b.v)
			return a.id<b.id;
		return a.v>b.v;
	}
	priority_queue<num>pq;
	bool cmpx(int x,int y){
		if(a[x].x==a[y].x)
			return a[x].y>a[y].y;
		return a[x].x<a[y].x;
	}
	bool cmpy(int x,int y){
		if(a[x].y==a[y].y)
			return a[x].x<a[y].x;
		return a[x].y<a[y].y;
	}
	void pushup(int x){
		a[x].maxx=a[x].x;
		a[x].minx=a[x].x;
		a[x].maxy=a[x].y;
		a[x].miny=a[x].y;
		if(a[x].ls){
			a[x].maxx=max(a[x].maxx,a[a[x].ls].maxx);
			a[x].minx=min(a[x].minx,a[a[x].ls].minx);
			a[x].maxy=max(a[x].maxy,a[a[x].ls].maxy);
			a[x].miny=min(a[x].miny,a[a[x].ls].miny);
		}
		if(a[x].rs){
			a[x].maxx=max(a[x].maxx,a[a[x].rs].maxx);
			a[x].minx=min(a[x].minx,a[a[x].rs].minx);
			a[x].maxy=max(a[x].maxy,a[a[x].rs].maxy);
			a[x].miny=min(a[x].miny,a[a[x].rs].miny);
		}
	}
	int build(int l,int r,int k){
		if(l>r)
			return 0;
		int mid=(l+r)>>1;
		if(k)
			nth_element(b+l,b+mid,b+1+r,cmpx);
		else
			nth_element(b+l,b+mid,b+1+r,cmpy);
		a[b[mid]].ls=build(l,mid-1,k^1);
		a[b[mid]].rs=build(mid+1,r,k^1);
		pushup(b[mid]);
		return b[mid];
	}
	void ask(int x){
		if(!x)
			return;
		if((int)pq.size()==k&&maxdis(a[x].minx,a[x].miny,a[x].maxx,a[x].maxy,px,py)<pq.top().v)
			return;
		if((int)pq.size()==k){
			int d=dis(px,py,a[x].x,a[x].y);
			if(d>pq.top().v||(d==pq.top().v&&x<pq.top().id))
				pq.push({x,d});
		}
		else
			pq.push({x,dis(px,py,a[x].x,a[x].y)});
		if((int)pq.size()>k)
			pq.pop();
		if(maxdis(a[a[x].ls].minx,a[a[x].ls].miny,a[a[x].ls].maxx,a[a[x].ls].maxy,px,py)>=maxdis(a[a[x].rs].minx,a[a[x].rs].miny,a[a[x].rs].maxx,a[a[x].rs].maxy,px,py)){
			ask(a[x].ls);
			ask(a[x].rs);
		}
		else{
			ask(a[x].rs);
			ask(a[x].ls);
		}
	}
	int main(){
		int n,q,root;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d%d",&a[i].x,&a[i].y);
			b[i]=i;
		}
		root=build(1,n,0);
		scanf("%d",&q);
		while(q--){
			scanf("%d%d%d",&px,&py,&k);
			ask(root);
			printf("%d\n",pq.top().id);
			while(pq.size()){
//				printf("%d:%d\n",pq.top().id,pq.top().v);
				pq.pop();
			}
		}
		return 0;
	}
}
int main(){
	estidi::main();
	return 0;
}
2024/6/12 10:44
加载中...