蒟蒻80pts求助
  • 板块P4148 简单题
  • 楼主whileAK
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/4 14:54
  • 上次更新2024/5/4 17:02:40
查看原帖
蒟蒻80pts求助
817925
whileAK楼主2024/5/4 14:54

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;
}
2024/5/4 14:54
加载中...