poj2155 二维线段树

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAX 1000+3

using namespace std;

int n,i;
int f[4*MAX][4*MAX];

void build_y(int x,int y,int la,int ra)
{
	f[x][y]=0;
	if(la==ra)
	  return;
	int mid=(la+ra)/2;
	build_y(x,2*y,la,mid);
	build_y(x,2*y+1,mid+1,ra);
}


void build_x(int x,int la,int ra)
{
	build_y(x,1,1,n);
	if(la==ra)
	  return;
	int mid=(la+ra)/2;
	build_x(2*x,la,mid);
	build_x(2*x+1,mid+1,ra);
	return;
}

int ans;

void modify_y(int x,int y,int la,int ra,int y1,int y2)
{
	if(y1<=la&&y2>=ra)
	  {
	  	 f[x][y]^=1;
	  	 return ;
	  }
	int mid=(la+ra)/2;
	if(y1<=mid)
	  modify_y(x,2*y,la,mid,y1,y2);
	if(y2>mid)
	  modify_y(x,2*y+1,mid+1,ra,y1,y2);
}

void modify_x(int x,int la,int ra,int x1,int y1,int x2,int y2)
{
	if(x1<=la&&ra<=x2)
	 {
	 	modify_y(x,1,1,n,min(y1,y2),max(y1,y2));
	 	return; 
	 }
	int mid=(la+ra)/2;
	if(x1<=mid)
	   modify_x(2*x,la,mid,x1,y1,x2,y2);
	if(x2>mid)
	  modify_x(2*x+1,mid+1,ra,x1,y1,x2,y2);
//	return ;
}

void ask_y(int x,int y,int la,int ra,int u)
{
	//cout<<ans<<' '<<f[x][y]<<endl;
	ans^=f[x][y];
	if(la==ra/*&&la==u*/)
	  {
	  	//ans=f[x][y];
	  	return ;
	  }
	int mid=(la+ra)/2;
	if(u<=mid)
	   ask_y(x,2*y,la,mid,u);
	if(u>mid)
	  ask_y(x,2*y+1,mid+1,ra,u);
	//return ;
}

void ask_x(int x,int la,int ra,int x0,int y0)
{
	ask_y(x,1,1,n,y0);
	if(la==ra)
	  {
	//  	ask_y(x,1,1,n,y0);
	  	return;
	  } 
	int mid=(la+ra)/2;
	if(x0<=mid)
	  ask_x(2*x,la,mid,x0,y0);
	if(x0>mid)
	  ask_x(2*x+1,mid+1,ra,x0,y0);
	//return;
}

int main() 
{
	int mm,m;
	cin>>mm;
	for(int ii=1;ii<=mm;ii++)
	 {
	 	cin>>n>>m;
	 	//cout<<"M=="<<m<<endl;
	 	build_x(1,1,n);
	 	//cout<<"___"<<endl;
	 	for(i=1;i<=m;i++)
	 	 {
	 	 	//cout<<i<<"I"<<endl;
	 	 	char ch;
	 	 	while(ch!='C'&&ch!='Q')
	 	 	  scanf("%c",&ch);
	 	 	//cout<<ch<<endl;
	 	 	if(ch=='C')
	 	 	 {
	 	 	 	int a1,a2,a3,a4;
	 	 	 	scanf("%d%d%d%d",&a1,&a2,&a3,&a4);
	 	 	 	modify_x(1,1,n,a1,a2,a3,a4);
	 	 	 /*	for(int j=1;j<=7;j++)
	 	 	 	  for(int k=1;k<=7;k++)
	 	 	 	    cout<<j<<' '<<k<<' '<<f[j][k]<<endl;//*/
	 	 	 }
	 	 	else
	 	 	 {
	 	 	 	ans=0;
	 	 	 	int a1,a2;
	 	 	 	scanf("%d%d",&a1,&a2);
	 	 	 	//cout<<a1<<' '<<a2<<endl;
	 	 	 	//cout<<"___"<<endl;
	 	 	 	ask_x(1,1,n,a1,a2);
	 	 	 	printf("%d\n",ans);
	 	 	 }
			ch='A';	 	 	 
	 	 }
	 	if(ii<mm)
		   cout<<endl; 
	 }
	cout<<"_____"<<endl;
}

楼教主的线段树。。大概写了三个小时,中间各种傻X错误啊。。其实二维线段树根本没有想得的那么难写。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值