蒟蒻才学K-D tree 重构写挂了 请大佬们帮忙看看!!!

P4148 简单题

zhenji_190127 @ 2021-06-17 09:45:36

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

(因为把重构部分注释掉提交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;
}

不胜感激!!!


by zhenji_190127 @ 2021-06-17 09:53:21

此贴完结

发现了自己在unfold函数中莫名多加了一个return;

我是nt


|