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;
}