求助
  • 板块P4148 简单题
  • 楼主ethan0328
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/22 07:45
  • 上次更新2023/12/22 16:09:22
查看原帖
求助
310581
ethan0328楼主2023/12/22 07:45

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";
		}
	}
}
2023/12/22 07:45
加载中...