关于ABC215的F题
  • 板块灌水区
  • 楼主rpdg
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/8/21 21:58
  • 上次更新2023/11/4 09:44:51
查看原帖
关于ABC215的F题
342651
rpdg楼主2021/8/21 21:58

数据太水了吧,我写个KDT都过了

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+8;
inline int read() {
	int s=1,a=0;
	char c=getchar();
	while(!isdigit(c)) {
		if(c=='-') s=-s;
		c=getchar();
	}
	while(isdigit(c)) {
		a=a*10+c-'0';
		c=getchar();
	}
	return s*a;
}
int n;
int ansmin=1e9+7,ansmax;
struct point {
	int x,y;
} a[N];
struct kdTree {
	int ls,rs,rt;
	point x;
	int u,d,l,r;
} tr[N];
int root;
void pushup(int p) {
	tr[p].l=tr[p].r=a[p].x;
	tr[p].u=tr[p].d=a[p].y;
	int lrt=tr[p].ls,rrt=tr[p].rs;
	if(lrt) {
		tr[p].l=min(tr[p].l,tr[lrt].l),tr[p].r=max(tr[p].r,tr[lrt].r);
		tr[p].u=min(tr[p].u,tr[lrt].u),tr[p].d=max(tr[p].d,tr[lrt].d);
	}
	if(rrt) {
		tr[p].l=min(tr[p].l,tr[rrt].l),tr[p].r=max(tr[p].r,tr[rrt].r);
		tr[p].u=min(tr[p].u,tr[rrt].u),tr[p].d=max(tr[p].d,tr[rrt].d);
	}
}
bool cmp1(point a,point b) {
	return (a.x<b.x)||(a.x==b.x&&a.y<b.y);
}
bool cmp2(point a,point b) {
	return (a.y<b.y)||(a.y==b.y&&a.x<b.x);
}
int build(int l,int r,int d) {
	if(l>=r) return 0;
	int mid=(l+r)>>1;
	tr[mid].rt=mid;
	if(d==1)
		nth_element(a+l,a+mid,a+r,cmp1);
	else
		nth_element(a+l,a+mid,a+r,cmp2);
	tr[mid].ls=build(l,mid,d^1);
	tr[mid].rs=build(mid+1,r,d^1);
	tr[mid].x=a[mid];
	pushup(mid);
	return mid;
}
int dist(point x,point y) {
	return min(abs(x.x-y.x),abs(x.y-y.y));
}
int fmax(int a,point b) {
	double ret=0;
	ret=max(max(dist((point){tr[a].r,tr[a].u},b),dist((point){tr[a].l,tr[a].u},b)),max(dist((point){tr[a].r,tr[a].d},b),dist((point){tr[a].l,tr[a].d},b)));
	return ret;
}
void querymax(int u,point x) {
	if(!u) return;
	ansmax=max(ansmax,dist(tr[u].x,x));
	double disl=fmax(tr[u].ls,x),disr=fmax(tr[u].rs,x);
	if(disl>ansmax&&disr>ansmax) {
		if(disl>disr) {
			querymax(tr[u].ls,x);
			if(ansmax<disr) querymax(tr[u].rs,x);
		}
		else {
			querymax(tr[u].rs,x);
			if(ansmax<disl) querymax(tr[u].ls,x);
		}
	} else {
		if(disl>disr) {
			querymax(tr[u].ls,x);
			if(ansmax<disr) querymax(tr[u].rs,x);
		}
		else {
			querymax(tr[u].rs,x);
			if(ansmax<disl) querymax(tr[u].ls,x);
		}
	}
}
int main() {
	n=read();
	for(int i=1;i<=n;i++) {
		scanf("%d %d",&a[i].x,&a[i].y);
	}
	root=build(1,n,1);
	for(int i=1;i<=n;i++) {
		querymax(root,a[i]);
	}
	printf("%d\n",ansmax);
	return 0;
}
2021/8/21 21:58
加载中...