您的位置:首页 > 其它

POJ2155 Matrix二维线段树

2015-08-20 11:53 218 查看
一,题意:

给你一个全为0的N * N的矩阵,对这个矩阵有两个操作(对于矩阵只有两个状态0,1)

(1):“C x1,y1,x2,y2” 就是将左上角为x1,y1,右下角为x2,y2,的这个矩阵内的数字全部翻转。

(2):“Q x1 y1” 输出a[x1][y1]的值。

二,解析:

该我主要应用令二位的树状数组,一个是行,一个是列。

三,代码:

#include<iostream>
#include<cstdio>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int Max=1002;
int Mat[Max][Max];
//Mat[i][j] 表示(i,j)到(n,n)区间改变次数
int N,T,X;
char str;
int step(int x)
{
return x&(-x);
}
int sum(int x,int y)
{//包含点(x,y)取区间改变次数和即(0.0)到(x,y)区间和;
int total=0;
for(int i=x; i>0; i-=step(i))
for(int j=y; j>0; j-=step(j))
total+=Mat[i][j];
return total;
}
void change(int x,int y)
{//将(x,y)到(n,n)区间反转增加一次
for(int i=x; i<=N; i+=step(i))
for(int j=y; j<=N; j+=step(j))
Mat[i][j]++;
}

int main()
{
scanf("%d",&X);
while(X--)
{
scanf("%d%d",&N,&T);
memset(Mat,0,sizeof(Mat));
while(T--)
{
getchar();
scanf("%c",&str);
if(str=='C')
{
int x_1,y_1,x_2,y_2;
scanf("%d%d%d%d",&x_1,&y_1,&x_2,&y_2);
change(x_1,y_1);
change(x_1,y_2+1);
change(x_2+1,y_1);
change(x_2+1,y_2+1);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
int key=sum(x,y);
printf("%d\n",key%2);
}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: