AC,但是跑样例错了
查看原帖
AC,但是跑样例错了
285617
黑影洞人楼主2023/6/9 16:17
#include<cstdio>
#include<algorithm>
#include<queue>
#define N 114514
#define int long long 
#define inf 2147483647
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
struct node{int x,y;}a[N];
int n,k;
bool cmpx(node x,node y){return x.x<y.x;}
bool cmpy(node x,node y){return x.y<y.y;}
int dis(node x,node y){return (x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y);}
struct kdt{
	int lx[N],rx[N],ly[N],ry[N],lson[N],rson[N];
	#define lc lson[p]
	#define rc rson[p]
	int ldis(int p,node x){
		int ax=max(x.x-lx[p],rx[p]-x.x);
		int ay=max(x.y-ly[p],ry[p]-x.y);
		return ax*ax+ay*ay;
	}
	int pushup(int p){
		lx[p]=rx[p]=a[p].x;
		ly[p]=ry[p]=a[p].y;
		if(lc){
			lx[p]=min(lx[lc],lx[p]),rx[p]=max(rx[lc],rx[p]);
			ly[p]=min(ly[lc],ly[p]),ry[p]=max(ry[lc],ry[p]);
		}
		if(rc){
			lx[p]=min(lx[rc],lx[p]),rx[p]=max(rx[rc],rx[p]);
			ly[p]=min(ly[rc],ly[p]),ry[p]=max(ry[rc],ry[p]);
		}
		return p;
	}
	int build(int l,int r){
		if(r<l)return 0;
		int p=l+((r-l)>>1);
		if(l&1)nth_element(a+l,a+p,a+r+1,cmpx);
		else nth_element(a+l,a+p,a+r+1,cmpy);
		lc=build(l,p-1);rc=build(p+1,r);
		return pushup(p);
	}
	void work(int l,int r,node x){
		if(r<l)return;
		int p=l+((r-l)>>1),val=dis(a[p],x);
		if(a[p].x!=x.x&&a[p].y!=x.y&&val>q.top())q.pop(),q.push(val);
		if(l==r)return;
		int vall=ldis(lc,x),valr=ldis(rc,x),mn=q.top();
		if(vall>mn&&valr>mn){
			if(vall>=valr){
				work(l,p-1,x);
				if(valr>q.top())work(p+1,r,x);
			}else{
				work(p+1,r,x);
				if(vall>q.top())work(l,p-1,x);
			}
		}else if(vall>mn)work(l,p-1,x);
		else if(valr>mn)work(p+1,r,x);
		return;
	}
}t;
signed main(){
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=k*2;i++)q.push(0);
	for(int i=1;i<=n;i++){
		int x,y;
		scanf("%lld%lld",&x,&y);
		a[i]=(node){x,y}; 
	}
	t.build(1,n);
	for(int i=1;i<=n;i++)t.work(1,n,a[i]);
	printf("%lld",q.top());
	return 0;
}


2023/6/9 16:17
加载中...