XTU 1229 烦人的异或 (异或运算)
2015-04-30 12:15
288 查看
题目:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1229
题目描述
如下图,有一N*M的表格,每个格子有一个数字。我们定义主矩形为给出的一对坐标所确定的矩形(该对坐标总是某个矩形的对顶点坐标对)。它最多可产生4个副矩形, 均由主矩形的顶点和表格边界确定。我们需要的是所有阴影部分的数的异或值。上图的x1=3,y1=3,x2=4,y2=4,所以答案就是a11^a12^a21^a22^a15^a16^a25^a26^a33^a34^a43^a44^a51^a52^a61^a62^a55^a56^a65^a66。
其中 '^' 代表异或符号,aij代表第i行第j列的方格中的数字。
输入
第一行是一个整数T(T≤10),表示测试数据组数。 每组数据第一行三个整数N,M,Q(0<N,M≤1000,Q≤500000),Q表示有Q组询问。 接着输入N行,每行有M个数字,表示表格里的数字(非负整数,且不大于109)。 最后有Q行,表示Q个询问,每行包含4个正整数x1,y1,x2,y2(1≤x1≤x2≤N,1≤y1≤y2≤M)。
输出
对于每个查询,输出一行,表示异或结果。
样例输入
1 4 4 3 1 0 2 1 0 2 1 1 2 1 1 0 1 1 0 2 2 2 2 2 2 2 3 3 2 2 4 4
样例输出
0 0 0
提示
大量的输入输出,请使用C风格的输入输出。
Source
WCB分析:打一个表,预存从(1,1)到p(i,j)的异或和。把异或和存在XOR[][]数组里面,输入放在a[][]数组里面,那么有
XOR[i][j]=XOR[i-1][j-1]^XOR[i-1][j]^XOR[i][j-1]^a[i][j].有了这个表就可以在O(1)内求出任意矩形区间 内的异或和。
代码:
/* ID: 15507481 PROG: test LANG: C++11 */ #include <iostream> #include <fstream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <algorithm> #include <set> #include <map> #include <vector> #include <string> #include <sstream> #include <queue> #include <stack> #include <deque> #include <list> //#include <forward_list> #include <numeric> using namespace std; typedef long long LL; //fill(vct.begin(),vct.end(),3); int a[1008][1008],XOR[1008][1008]; int main() { int ncase,i,j,m,n,Q,x1,y1,x2,y2,x3,y3,x4,y4; scanf("%d",&ncase); while(ncase--) { scanf("%d%d%d",&n,&m,&Q); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); XOR[i][j]=XOR[i-1][j]^XOR[i-1][j-1]^XOR[i][j-1]^a[i][j]; } } while(Q--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); int minx,miny,maxx,maxy; minx=min(x1,x2); miny=min(y1,y2); maxx=max(x1,x2); maxy=max(y1,y2); x1=minx; y1=miny; x2=maxx; y2=maxy; x3=maxx; y3=miny; x4=minx; y4=maxy; int A,B,C,D,E; A=XOR[x1-1][y1-1]; B=XOR[x4-1][y4]^XOR[x4-1][m]; C=XOR[x3][y3-1]^XOR [y3-1]; D=XOR[x2][y2]^XOR[x2][m]^XOR [y2]^XOR [m]; E=XOR[x1-1][y1-1]^XOR[x2][y2]^XOR[x3][y3-1]^XOR[x4-1][y4]; printf("%d\n",A^B^C^D^E); } } return 0; } // // // // // // //
相关文章推荐
- bzoj-4103 异或运算
- 389. Find the Difference注意异或运算的巧妙使用^
- Zoj 3870 Team Formation(异或运算)
- 按位与、或、异或等运算方法
- 按位与、或、异或等运算方法
- 利用异或进行加密,运算
- poj2965 bfs+位运算 异或真他妈的NB
- hdoj 1563 Find your present!&&2095 Find your present(2) 异或运算
- C的|、||、&、&&、异或、~、!运算
- hdu 4768 异或运算
- 异或运算
- java中与运算,或运算,异或运算,取反运算
- leetcode_461. Hamming Distance 计算汉明距离,按位异或运算,计算整数的二进制表示中1的个数 java
- 按位与,或,异或运算方法
- java对文件简单的加密解密(异或运算)
- 【BZOJ 4103】【THUSC 2015】异或运算
- BUG修复:PaxScript没有异或运算的bug
- 按位与、或、异或等运算方法
- C语言实现数组倒置(异或运算)
- 异或运算应用