abc271_f XOR on Grid Path 题解
XOR on Grid Path
题意
有一个
你站在
数据范围
思路
折半搜索。
折半搜索,顾名思义就是把一条搜索路径分成两条,每条路径先各自考虑,最后将两条路径合起来考虑。
但折半搜索不一定是折半,在某些特定情况下分界点可以不同。
这个题不是特殊题,分界点就在正中间。
不难发现,走
折半搜索,两边分别记录一下各自会出现哪些异或和(假设用
。 。
经过计算,我们发现要开 long long
存储。
复杂度
- 时间:
。 - 空间:
。
Code
点击查看代码
#include <iostream> #include <vector> #include <algorithm> using namespace std; using ll = long long; int n, a[30][30]; vector<int> v, g; ll ans; void dfs (int x, int y, int z) { // 前半条路径 if (x == 0 || y == 0) { return ; } z ^= a[x][y]; if (x + y == 2) { v.push_back(z); return ; } dfs(x - 1, y, z), dfs(x, y - 1, z); } void dfs2 (int x, int y, int z) { // 后半条路径 if (x > n || y > n) { return ; } z ^= a[x][y]; if (x + y == 2 * n) { g.push_back(z); return ; } dfs2(x + 1, y, z), dfs2(x, y + 1, z); } int main () { ios::sync_with_stdio(0), cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; } } for (int i = 1; i <= n; i++) { vector<int> ().swap(v); vector<int> ().swap(g);// 清空 dfs(i, n + 1 - i, 0); dfs2(i, n + 1 - i, a[i][n + 1 - i]); // 当前这个点会被算两次,怎么能行,先处理一下 sort(v.begin(), v.end()), sort(g.begin(), g.end()); for (int j : v) { int l = lower_bound(g.begin(), g.end(), j) - g.begin(), r = upper_bound(g.begin(), g.end(), j) - g.begin(); // 二分求满足要求的整数对数 ans += r - l; } } cout << ans; return 0; }
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/17426799.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步