一,题意:
给你一个全为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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/yu_zhi_bo_zhi_shui/article/details/47805663