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