题解:http://blog.youkuaiyun.com/u010885899/article/details/48131075
#include<bits/stdc++.h>
using namespace std;
const int MAXN=131173;
int a1[110][MAXN],a2[MAXN][100];
int main()
{
int i,j,n,m,q;
for(i=2;i<MAXN;i++)
scanf("%d",&a1[1][i]);
for(i=2;i<MAXN;i++)
scanf("%d",&a2[i][1]);
for(i=2;i<=100;i++)
{
a1[i][1]=a2[i][1];
a2[1][i]=a1[1][i];
}
for(i=2;i<=100;i++)
for(j=2;j<MAXN;j++)
a1[i][j]=a1[i-1][j]^a1[i][j-1];
for(i=2;i<MAXN;i++)
for(j=2;j<=100;j++)
a2[i][j]=a2[i-1][j]^a2[i][j-1];
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&n,&m);
printf("%d\n",a1[n][m+131072]^a2[n+131072][m]);
}
}

本文介绍了一种使用二维前缀异或表处理查询的方法。通过预处理数组a1和a2,可以在常数时间内计算出任意子矩阵的异或和,有效地解决了二维范围查询问题。
722

被折叠的 条评论
为什么被折叠?



