蒟蒻才学K-D tree 重构写挂了 请大佬们帮忙看看!!!
查看原帖
蒟蒻才学K-D tree 重构写挂了 请大佬们帮忙看看!!!
247842
zhenji_190127楼主2021/6/17 09:45

已经锁定是重构函数部分的问题

(因为把重构部分注释掉提交AC了)

这里是蒟蒻的代码

#include<bits/stdc++.h>
using namespace std;
int n;
struct ELE
{
	int x,y;
	int L,R,U,D;
	short d; 
	int ls,rs;
	int size;
	int occ;
	int sum;
}a[200010];
bool cmp1(int A,int B)
{
	return a[A].x<a[B].x;
}
bool cmp2(int A,int B)
{
	return a[A].y<a[B].y;
}
int root=0,num=0;
bool jud(int p)
{
	return a[p].size*0.75<max(a[a[p].ls].size,a[a[p].rs].size);
}
int rt[200010],cnt;
void unfold(int p)
{
	if(p==0)return ;
	unfold(a[p].ls);
	if(a[p].occ)
	{
		cnt++;
		rt[cnt]=p;
		return ;
	}
	unfold(a[p].rs); 
}
void update(int p)
{
	a[p].size=a[a[p].ls].size+a[a[p].rs].size+1;
	a[p].sum=a[p].occ+a[a[p].ls].sum+a[a[p].rs].sum;
	a[p].L=a[p].x;
	a[p].R=a[p].x;
	a[p].U=a[p].y;
	a[p].D=a[p].y;
	if(a[p].ls)
	a[p].L=min(a[a[p].ls].L,a[p].L),
	a[p].R=max(a[a[p].ls].R,a[p].R),
	a[p].D=min(a[a[p].ls].D,a[p].D),
	a[p].U=max(a[a[p].ls].U,a[p].U);
	if(a[p].rs)
	a[p].L=min(a[a[p].rs].L,a[p].L),
	a[p].R=max(a[a[p].rs].R,a[p].R),
	a[p].D=min(a[a[p].rs].D,a[p].D),
	a[p].U=max(a[a[p].rs].U,a[p].U);			
}
int rebuild(int l,int r)
{
	if(l==r)return 0;
	int mid=(l+r)/2; 
	double avx=0,avy=0,vax=0,vay=0;
	for(int i=l;i<r;i++)
		avx+=a[rt[i]].x,
		avy+=a[rt[i]].y;
	avx/=(r-l);
	avy/=(r-l);
	for(int i=l;i<r;i++)
		vax+=(a[rt[i]].x-avx)*(a[rt[i]].x-avx),
		vay+=(a[rt[i]].y-avy)*(a[rt[i]].y-avy);
	if(vax>=vay)
	{
		nth_element(rt+l,rt+mid,rt+r,cmp1);
		a[rt[mid]].d=1;
	}
	else
	{
		nth_element(rt+l,rt+mid,rt+r,cmp2);
		a[rt[mid]].d=2;		
	}
	a[rt[mid]].ls=rebuild(l,mid);
	a[rt[mid]].rs=rebuild(mid+1,r);
	update(rt[mid]);
	return rt[mid];
}
void bal(int &p)
{
	cnt=0;
	unfold(p);
	p=rebuild(1,cnt+1); 
}
void insert(int &p,int x,int y,int v)
{
	if(p==0)
	{
		if(root==0)root=1;
		num++;
		p=num;
		a[p].x=x;
		a[p].y=y;
		a[p].ls=a[p].rs=0;
		a[p].occ=v;
		a[p].d=rand()%2+1;
		update(p);
	}
	else
	{
		if(a[p].x==x&&a[p].y==y)a[p].occ+=v;
		else
		{
			if(a[p].d==1)//按x维度划分 
			{
				if(x<=a[p].x)insert(a[p].ls,x,y,v);
				else insert(a[p].rs,x,y,v);
			}
			else//按y维度划分 
			{
				if(y<=a[p].y)insert(a[p].ls,x,y,v);
				else insert(a[p].rs,x,y,v);				
			}
		}
		update(p);
		if(jud(p))bal(p);
	}
}
int xr,xl,yu,yd;
int adx,ady; 
int adv;
int last;
int query(int p){
	if(p==0)return 0;
	if(xr<a[p].L||xl>a[p].R||yu<a[p].D||yd>a[p].U)return 0;
	if(xl<=a[p].L&&a[p].R<=xr&&yd<=a[p].D&&a[p].U<=yu)return a[p].sum;
	int ret=0;
	if(xl<=a[p].x&&a[p].x<=xr&&yd<=a[p].y&&a[p].y<=yu)ret+=a[p].occ;
	return ret+query(a[p].ls)+query(a[p].rs);
}
int main()
{
	scanf("%d",&n);
	while(1)
	{
		int option;
		scanf("%d",&option);
		if(option==1)
		{
			scanf("%d%d%d",&adx,&ady,&adv);
			adx^=last;
			ady^=last;
			adv^=last;
			insert(root,adx,ady,adv);
		}
		else if(option==2)
		{
			scanf("%d%d%d%d",&xl,&yd,&xr,&yu);
			xl^=last;
			yd^=last;
			xr^=last;
			yu^=last; 
			last=query(root);
			printf("%d\n",last);
		}
		else break;    
	}
	return 0;
}

不胜感激!!!

2021/6/17 09:45
加载中...