| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
帖一个,自己的第一个二维线段树#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
bool seg[4010][4010];
int n,m,T,ans;
void buildy(int i,int l,int r,int rt)
{
seg[i][rt] = 0;
if(l == r) return ;
int m = (l + r) >> 1;
buildy(i,lson);
buildy(i,rson);
}
void buildx(int l,int r,int rt)
{
buildy(rt,1,n,1);
if(l == r) return ;
int m = (l + r) >> 1;
buildx(lson);
buildx(rson);
}
void updatey(int i,int L,int R,int l,int r,int rt)
{
if(L <= l && r <= R)
{
seg[i][rt]^= 1;
return ;
}
int m = (l + r) >> 1;
if(m >= L)
updatey(i,L,R,lson);
if(m < R)
updatey(i,L,R,rson);
}
void updatex(int L,int R,int y1,int y2,int l,int r,int rt)
{
if(L <= l && r <= R)
{
updatey(rt,y1,y2,1,n,1);
return ;
}
int m = (l + r) >> 1;
if(L <= m) updatex(L,R,y1,y2,lson);
if(R > m) updatex(L,R,y1,y2,rson);
}
void queryy(int i,int y,int l,int r,int rt)
{
ans^= seg[i][rt];
if(l == r)
return ;
int m = (l + r) >> 1;
if(y <= m) queryy(i,y,lson);
else queryy(i,y,rson);
}
void queryx(int x,int y,int l,int r,int rt)
{
queryy(rt,y,1,n,1);
if(l == r)
return ;
int m = (l + r) >> 1;
if(x <= m) queryx(x,y,lson);
else queryx(x,y,rson);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
buildx(1,n,1);
for(int i = 0 ; i < m ; i++)
{
char s[2];
scanf("%s",s);
if(s[0] == 'C')
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
updatex(x1,x2,y1,y2,1,n,1);
}
else
{
ans = 0;
int x,y;
scanf("%d%d",&x,&y);
queryx(x,y,1,n,1);
printf("%d\n",ans);
}
}
if(T)
printf("\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator