蒟蒻80pts求助

P4148 简单题

whileAK @ 2024-05-04 14:54:23

Wa on #2,在1400多行挂了。删掉重构部分代码就过了,有没有强神看看重构哪挂了

顺便吐槽数据水,不重构的平衡树居然跑得飞快


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void rd(int &p){
    int f=1;p=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
    p*=f;
}
void rdl(ll &p){
    ll f=1;p=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
    p*=f;
}
const int N=4e5+50;
const double alpha=0.77;
int n,cnt(0),num,use[N],tp(0),rt(0),now;
struct K_D{
    int ls,rs,sz,sum,val,x,y,xm,ym,xx,yx;
    bool w;
}t[N];
struct kkk{
    int val,x,y;
}a[N];
int New(int v,bool w,int x,int y){
    cnt=use[tp];--tp;
    t[cnt].sz=1;t[cnt].ls=t[cnt].rs=0;
    t[cnt].val=t[cnt].sum=v;t[cnt].w=w;
    t[cnt].x=t[cnt].xm=t[cnt].xx=x,t[cnt].y=t[cnt].ym=t[cnt].yx=y;
    return cnt;
}
void up(int p){
    t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum+t[p].val;
    t[p].sz=t[t[p].ls].sz+t[t[p].rs].sz+1;
    t[p].xm=min(min(t[t[p].ls].xm,t[t[p].rs].xm),t[p].x);
    t[p].ym=min(min(t[t[p].ls].ym,t[t[p].rs].ym),t[p].y);
    t[p].xx=max(max(t[t[p].ls].xx,t[t[p].rs].xx),t[p].x);
    t[p].yx=max(max(t[t[p].ls].yx,t[t[p].rs].yx),t[p].y);
}
bool balence(int p){
    return alpha*t[p].sz>=1.0*max(t[t[p].ls].sz,t[t[p].rs].sz);
}
void dfs(int p){
    if(!p)return;
    dfs(t[p].ls);
    a[++num].val=t[p].val;a[num].x=t[p].x;a[num].y=t[p].y;
    use[++tp]=p;
    dfs(t[p].rs);
}
bool cmp(kkk x,kkk y){
    if(now)return x.x<y.x;
    return x.y<y.y;
}
void rebuild(int &p,int l,int r,bool w){
    if(l>r){
        p=0;return;
    }
    int mid=l+r>>1;now=w;
    nth_element(a+l,a+mid,a+r+1,cmp);
    p=New(a[mid].val,w,a[mid].x,a[mid].y);
    rebuild(t[p].ls,l,mid-1,w^1);
    rebuild(t[p].rs,mid+1,r,w^1);
    up(p);
}
void Insert(int &p,int x,int y,int z,bool w){
    if(!p){
        p=New(z,w,x,y);return;
    }
    if(w){
        if(x<=t[p].x)Insert(t[p].ls,x,y,z,w^1);
        else Insert(t[p].rs,x,y,z,w^1);
    }
    else{
        if(y<=t[p].y)Insert(t[p].ls,x,y,z,w^1);
        else Insert(t[p].rs,x,y,z,w^1);
    }
    up(p);
    if(!balence(p)){
        num=0;dfs(p);rebuild(p,1,num,w);
    }
}
int ask(int lx,int rx,int ly,int ry,int p){
    if(!p)return 0;
    if(t[p].xm>rx||t[p].xx<lx||t[p].ym>ry||t[p].yx<ly)return 0;
    if(t[p].xm>=lx&&t[p].xx<=rx&&t[p].ym>=ly&&t[p].yx<=ry)return t[p].sum;
    int ans(0);
    if(t[p].w){
        if(lx<=t[p].x)ans=ask(lx,rx,ly,ry,t[p].ls);
        if(rx>t[p].x)ans+=ask(lx,rx,ly,ry,t[p].rs);
    }
    else{
        if(ly<=t[p].y)ans=ask(lx,rx,ly,ry,t[p].ls);
        if(ry>t[p].y)ans+=ask(lx,rx,ly,ry,t[p].rs);
    }
    if(lx<=t[p].x&&t[p].x<=rx&&ly<=t[p].y&&t[p].y<=ry)ans+=t[p].val;
    return ans;
}
int op,x,y,l,r,ans(0);
int main(){
    for(int i(1);i<N;++i)use[++tp]=N-i;
    t[0].xm=t[0].ym=1e9+7;
    rd(n);
    while(true){
        rd(op);
        if(op==3)break;
        rd(x);rd(y);rd(l);x^=ans;y^=ans;l^=ans;
        if(op==1)Insert(rt,x,y,l,true);
        else{
            rd(r);r^=ans;
            printf("%d\n",ans=ask(x,l,y,r,rt));
        }
    }
    return 0;
}

|