您当前的位置: 首页 > 

对方正在debug

暂无认证

  • 4浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Grid Xor(构造/贪心)

对方正在debug 发布时间:2022-01-28 23:32:34 ,浏览量:4

题目 题意:现在有一个 n ∗ n n*n n∗n的数组 a a a( n n n为偶数),但是丢失了它的数据,我们只知道,每个元素的相邻元素的异或和,构成的数组 b b b。相邻元素是指,元素的上下左右相邻的元素。现在已知 b b b,求原数组 a a a的所有元素的异或和。

参考Adityakumar007的提交代码。

思路:求 b b b所有元素的异或和,肯定会重复计算。我们可以遍历数组 b b b,在计算当前元素 b i j b_{ij} bij​之前,先判断它贡献的相邻元素 a [ i − 1 ] [ j ] , a [ i + 1 ] [ j ] , a [ i ] [ j − 1 ] , a [ i ] [ j + 1 ] a[i-1][j],a[i+1][j],a[i][j-1],a[i][j+1] a[i−1][j],a[i+1][j],a[i][j−1],a[i][j+1],是否别的 b b b元素已经贡献过。如果贡献过,则当前的 b i j b_{ij} bij​不加进来。

通过这个策略,我们可以保证每个 a i j a_{ij} aij​元素只会贡献一次。同时,每个 a i j a_{ij} aij​都会被统计进来。

如图4x4的例子,红色数字表示遍历过程中有效的 b b b位置,圆圈数字表示每个有效 b b b位置的贡献点,我们可以看到,所有位置都有一个贡献点。严格证明不会,就拿图片感性理解,凑合下吧_(:з」∠)_ 在这里插入图片描述

#include 
using namespace std;
const int maxn = 1010;
#define ll long long

int n;
int a[maxn][maxn];
bool vis[maxn][maxn];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

bool check(int x, int y) {
	bool flag = 1;// 判断贡献的位置,是否别人已经贡献过 
	for (int i = 0; i = 0 && xx = 0 && yy             
关注
打赏
1664895754
查看更多评论
0.0390s