10分WA求助
查看原帖
10分WA求助
324226
X2H_tato楼主2023/8/15 15:47

只A了#9,代码可能不太精简,跪求大佬提示/改错

#include <bits/stdc++.h>
using namespace std;
const int N=1e5*4+5;
int lie[N],hang[N];

void push_up1 (int p)
{
	hang[p]=hang[p<<1]+hang[p<<1|1];
}

void update1 (int nl,int l,int r,int p)
{
	if(l==r)
	{
		hang[p]^=1;
		return ;
	}
	int mid=(l+r)>>1;
	if(nl<=mid)
		update1(nl,l,mid,p<<1);
	else
		update1(nl,mid+1,r,p<<1|1);
	push_up1(p);
}

void push_up2 (int p)
{
	lie[p]=lie[p<<1]+lie[p<<1|1];
}

void update2 (int nl,int l,int r,int p)
{
	if(l==r)
	{
		lie[p]^=1;
		return ;
	}
	int mid=(l+r)>>1;
	if(nl<=mid)
		update2(nl,l,mid,p<<1);
	else
		update2(nl,mid+1,r,p<<1|1);
	push_up2(p);
}

long long query1 (int nl,int nr,int l,int r,int p)
{
	long long res=0;
	if(nl<=l&&r<=nr) return hang[p];
	int mid=(l+r)>>1;
	if(nl<=mid) res+=query1(nl,nr,l,mid,p<<1);
	if(nr>mid) res+=query1(nl,nr,mid+1,r,p<<1|1);
	return res;
}

long long query2 (int nl,int nr,int l,int r,int p)
{
	long long res=0;
	if(nl<=l&&r<=nr) return lie[p];
	int mid=(l+r)>>1;
	if(nl<=mid) res+=query2(nl,nr,l,mid,p<<1);
	if(nr>mid) res+=query2(nl,nr,mid+1,r,p<<1|1);
	return res;
}

int main()
{
	/*freopen("P3801_1.in","r",stdin);
	freopen("ans.out","w",stdout);*/
	int n,m,q;
	scanf("%d%d%d",&n,&m,&q);
	while(q--)
	{
		int t;
		cin>>t;
		if(t==1)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			update1(x,1,n,1);
			update2(y,1,m,1);
		}
		else
		{
			int x1,y1,x2,y2;
			scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
			long long s1=query1(x1,x2,1,n,1);
			long long s2=query2(y1,y2,1,n,1);
			//cout<<s1<<" "<<s2<<endl;
			printf("%lld\n",s1*(y2-y1+1)+s2*(x2-x1+1)-s1*s2*2);
		}
	}
	return 0;
}

2023/8/15 15:47
加载中...