题目描述:
有这样一段程序:
f(n, m)
{
if n=1 or m = 1
return a[n][m];
return f(n-1, m) ^ f(n, m-1);
}
input 2<=n,m<=100
for i=2->100 input a[1][i]
for i=2->100 input a[i][1]
output f(n,m)
程序的运行效率很低,所以当n和m较大时用时太长。不过机智的小b很快解决了这个问题。
这时小c出现了,他将n,m都增加131072,由于n,m的增加,读入变为2->131172的所有a[1][i]和a[i][1]。
小b犯了难,所以来找你,你能帮他解决这个问题吗?
输入:
第一行读入131171个正整数,表示a[1][i] (i=2->131172, 1<=a[1][i]<=1000000000)。
第二行读入131171个正整数,表示a[i][1] (i=2->131172, 1<=a[1][i]<=1000000000)。
第三行读入一个正整数Q(1<=Q<=10000),表示询问次数。
接下来Q行,每行两个数n,m(2<=n,m<=100),表示每一组询问。
输出:
Q行,每行为f(n+131072,m+131072)。
输入示例
2 3 4 5 6 7 8 ... 131171 131172 2 3 4 5 6 7 8 ... 131171 131172 3 2 2 2 3 2 4
输出示例
0 0 131072
测试输入![]() | 期待的输出![]() | 时间限制![]() | 内存限制![]() | 额外进程![]() | |
|---|---|---|---|---|---|
| 测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
a[i][j]=a[i-1][j]^a[i][j-1]=a[i-2][j]^a[i-1][j-1]^a[i-1][j-1]^a[i][j-2]=a[i-2][j]^a[i][j-2]
a[i][j]=a[i-2][j]^a[i][j-2]=a[i-4][j]^a[i-2][j-2]^a[i-2][j-2]^a[i][j-4]=a[i-4][j]^a[i][j-4]
以此类推可以发现
a[i][j]=a[i-131072][j]^a[i][j-131072]
预处理a[1..100][1..131172]与a[1..131172][1..100]
对于每个询问答案即为a[n][131072+m]^a[131072+n][m]
#include<stdio.h>
#include<string.h>
int a[101][131173], ans[101][101],temp[101][101];
int main()
{
// freopen("F:in.txt", "r", stdin);
memset(a, 0, sizeof(a));
for (int i = 2; i <= 131172; i++)
{
scanf("%d", &a[1][i]);
if (i <= 100)
temp[1][i] = a[1][i];
}
for (int i = 2; i <= 100; i++)
{
scanf("%d", &a[i][1]);
temp[i][1] = a[i][1];
}
int n;
for (int i = 2; i <= 100;i++)
for (int j = 2; j <= 131172; j++)
a[i][j] = a[i - 1][j] ^ a[i][j - 1];
for (int i = 2; i <= 100;i++)
for (int j = 2; j <= 100; j++)
ans[i][j] = a[i][j + 131072];
for (int i = 2; i <= 100; i++)
{
a[1][i] = temp[i][1];
a[i][1] = temp[1][i];
}
for (int i = 101; i <= 131172; i++)
scanf("%d", &a[1][i]);
for (int j = 2; j <= 131172;j++)
for (int i = 2; i <= 100; i++)
a[i][j] = a[i - 1][j] ^ a[i][j - 1];
for (int i = 2; i <= 100; i++)
for (int j = 2; j <= 100; j++)
ans[i][j] = ans[i][j] ^ a[j][i+131072];
scanf("%d", &n);
int x, y;
while (n--)
{
scanf("%d%d", &x, &y);
printf("%d\n", ans[x][y]);
}
return 0;
}
大数组优化与异或运算
本文介绍了一道关于大数组处理与异或运算的算法题。通过巧妙地利用异或性质,避免了直接递归导致的时间复杂度过高的问题,并通过优化数组存储策略解决了内存限制的问题。

2449

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



