k-d Tree板子题
查看原帖
k-d Tree板子题
483966
一粒夸克楼主2021/7/11 11:56

[CQOI2016]K 远点对的代码改了一下,样例能过,交上去全WA

求捉虫:

#include<bits/stdc++.h>
using namespace std;
int n,k,now_,rt,Q;
struct node{
	long long x[2];
	inline bool operator <(const node &b)const{
		return x[now_]<b.x[now_];
	}
}tr[200005];
int le[100005],ri[100005];
long long mx[2][100005],mn[2][100005];
inline long long pwr(long long x){
	return x*x;
}
inline long long dis(int i,int j){
	return pwr(tr[i].x[0]-tr[j].x[0])+pwr(tr[i].x[1]-tr[j].x[1]);
}
inline long long max_dis(int i,int j){
	if(!j)return 0;
	return max(pwr(tr[i].x[0]-mx[0][j]),pwr(tr[i].x[0]-mn[0][j]))+max(pwr(tr[i].x[1]-mx[1][j]),pwr(tr[i].x[1]-mn[1][j]));
}
inline void pushup(int i){
	if(le[i]){
		mx[0][i]=max(mx[0][i],mx[0][le[i]]);
		mx[1][i]=max(mx[1][i],mx[1][le[i]]);
		mn[0][i]=min(mn[0][i],mn[0][le[i]]);
		mn[1][i]=min(mn[1][i],mn[1][le[i]]);
	}
	if(ri[i]){
		mx[0][i]=max(mx[0][i],mx[0][ri[i]]);
		mx[1][i]=max(mx[1][i],mx[1][ri[i]]);
		mn[0][i]=min(mn[0][i],mn[0][ri[i]]);
		mn[1][i]=min(mn[1][i],mn[1][ri[i]]);
	}
}
int build(int l=1,int r=n,int _=1){
	if(l>r)return 0;now_=_;
	int mid=(l+r)>>1;
	nth_element(tr+l,tr+mid+1,tr+r+1);
	le[mid]=build(l,mid-1,_^1);
	ri[mid]=build(mid+1,r,_^1);
	mx[0][mid]=mn[0][mid]=tr[mid].x[0];
	mx[1][mid]=mn[1][mid]=tr[mid].x[1];
	pushup(mid);
	return mid;
}
struct pir{
	long long first;
	int second;
	inline bool operator <(const pir &b)const{
		if(first!=b.first)return first>b.first;
		return second<b.second;
	}
	inline pir(long long fir,int sec){
		first=fir;second=sec;
	}
};
priority_queue<pir>q;
void query(int i){
	if(!i)return ;
	long long tmp=dis(0,i);
	if(tmp>q.top().first||(tmp==q.top().first&&i<q.top().second)){
		q.pop();q.push(pir(tmp,i));
	}
	long long xl=max_dis(0,le[i]);
	long long xr=max_dis(0,ri[i]);
	if(xl<xr)swap(xl,xr),swap(le[i],ri[i]);
	if(xl>=q.top().first)query(le[i]);
	if(xr>=q.top().first)query(ri[i]);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lld%lld",&tr[i].x[0],&tr[i].x[1]);
	rt=build();
	scanf("%d",&Q);
	for(int i=0;i<Q;i++){
		while(!q.empty())q.pop();
		scanf("%lld%lld%d",&tr[0].x[0],&tr[0].x[1],&k);
		while(k--)q.push(pir(0,-1));
		query(rt);
		printf("%d\n",q.top().second);
	}

	return 0;
}
2021/7/11 11:56
加载中...