求助

P4148 简单题

ethan0328 @ 2023-12-22 07:45:28

KDT 求调,后 4 个点 RE,应该是因为 WA 导致 RE。

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
struct node
{
    int val,sum,ls,rs,ar[2],lb[2],rb[2];
};
int n,a[N],ind,cnt,rt[30];
node t[N];
bool cmp1(int x,int y)
{
    return t[x].ar[0]<t[y].ar[0];
}
bool cmp2(int x,int y)
{
    return t[x].ar[1]<t[y].ar[1];
}
void push_up(int p)
{
    t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum+t[p].val;
    for(int i=0;i<2;i++)
    {
        t[p].lb[i]=t[p].rb[i]=t[p].ar[i];
        if(t[p].ls)
        {
            t[p].lb[i]=min(t[p].lb[i],t[t[p].ls].lb[i]);
            t[p].rb[i]=max(t[p].rb[i],t[t[p].ls].rb[i]);
        }
        if(t[p].rs)
        {
            t[p].lb[i]=min(t[p].lb[i],t[t[p].rs].lb[i]);
            t[p].rb[i]=max(t[p].rb[i],t[t[p].rs].rb[i]);
        }
    }
}
int build(int l,int r,int k)
{
    if(r<l)
    {
        return 0;
    }
    int mid=(l+r)>>1;
    nth_element(a+1,a+mid,a+r+1,k? cmp2:cmp1);
    t[a[mid]].ls=build(l,mid-1,k^1);
    t[a[mid]].rs=build(mid+1,r,k^1);
    push_up(a[mid]);
    return a[mid];
}
void clr(int &p)
{
    if(!p)
    {
        return;
    }
    a[++cnt]=p;
    clr(t[p].ls);
    clr(t[p].rs);
    p=0;
}
int query(int p,int x[2],int y[2])
{
    if(!p)
    {
        return 0;
    }
    bool flg=1;
    for(int i=0;i<2;i++)
    {
        flg&=(x[i]<=t[p].lb[i]&&t[p].rb[i]<=y[i]);
    }
    if(flg)
    {
        return t[p].sum;
    }
    for(int i=0;i<2;i++)
    {
        if(t[p].rb[i]<x[i]||t[p].lb[i]>y[i])
        {
            return 0;
        }
    }
    flg=1;
    for(int i=0;i<2;i++)
    {
        flg&=(x[i]<=t[p].ar[i]&&t[p].ar[i]<=y[i]);
    }
    int ret=0;
    if(flg)
    {
        ret+=t[p].val;
    }
    ret+=query(t[p].ls,x,y)+query(t[p].rs,x,y);
    return ret;
}
signed main()
{
    int lst=0,op,x,y,z,ll[2],rr[2];
    cin>>n;
    while(cin>>op)
    {
        if(op==3)
        {
            break;
        }
        if(op==1)
        {
            ind++; 
            cin>>t[ind].ar[0]>>t[ind].ar[1]>>t[ind].val;
            t[ind].ar[0]^=lst;
            t[ind].ar[1]^=lst;
            t[ind].val^=lst;
            cnt=0;
            a[++cnt]=ind;
            for(int i=0;i<=20;i++)
            {
                if(!rt[i])
                {
                    rt[i]=build(1,cnt,0);
                    break;
                }else
                {
                    clr(rt[i]);
                }
            }
        }else
        {
            cin>>ll[0]>>ll[1]>>rr[0]>>rr[1];
            ll[0]^=lst;ll[1]^=lst;
            rr[0]^=lst;rr[1]^=lst;
            lst=0;
            for(int i=0;i<=20;i++)
            {
                lst+=query(rt[i],ll,rr); 
            }
            cout<<lst<<"\n";
        }
    }
}

|