T1:异或序列
给定长度为 的数组 ,求出
多组测试数据
限制:
参考难度:
普及+/提高
算法分析
分
由于 ,直接使用三层循环,枚举 数组所有区间,然后循环求异或即可。
分
需要联系到异或运算的特性,如果求 ,可以变成 和 取异或。设 ,那么区间 的异或和可以表示成 。只需 时间就能求出区间的异或和,可以优化成 。
分
由于异或运算是按位操作,所以二进制的不同位不会互相影响,我们可以分成 位进行考虑,那么 数组可以看作 或 的数字。
如果数组只有 或者 ,一个区间的异或和只和区间中 的个数奇偶性有关系。如果有奇数个 ,答案就是 ;如果有偶数个 ,答案就是 。
可以使用上面的 数组方便计算,枚举二进制的第 位,再枚举区间的右端点 ,如果希望对答案有贡献,那么 在二进制第 位必须是 。如果 在第 位是 ,那么它对答案的贡献是 到 中第 位是 的个数;如果 在第 位是 ,那么它对答案的贡献是 到 中第 位是 的个数。
整体时间复杂度为 ,其中 最大为 。
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ull = unsigned long long; int main() { cin.tie(nullptr) -> sync_with_stdio(false); int t; cin >> t; while (t--) { int n; cin >> n; vector<int> a(n); rep(i, n) cin >> a[i]; vector<int> s(n+1); rep(i, n) s[i+1] = s[i]^a[i]; ull ans = 0; rep(j, 30) { int c0 = 1, c1 = 0; ull now = 0; for (int i = 1; i <= n; ++i) { if (s[i]>>j&1) now += c0, c1++; else now += c1, c0++; } ans += now*(1<<j); } cout << ans << '\n'; } return 0; }
T3: 小猴摘桃
给定一颗树,求树上经过偶数个节点的路径数量。
限制:
参考难度:
普及+/提高
算法分析
分
枚举起点 ,枚举终点 ,使用 DFS
求出起点到终点的距离,如果距离是奇数,说明经过的结点是偶数个,答案加 。
分
枚举起点 ,使用 BFS
求出 到所有点的距离,对于距离为奇数的点,说明经过的结点是偶数个,答案加上距离是奇数的点的数量。
也可以枚举起点 和终点 ,然后使用 lca
求 到 的距离。
分
树形dp
记 dp[v][0/1]
表示以 为根的子树中到 距离为偶数/奇数的点的个数
转移方程:
dp[v][0] += dp[u][1] dp[v][1] += dp[u][0]+1
最后的答案就是 。
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; int main() { int n; cin >> n; vector<vector<int>> to(n); rep(i, n-1) { int a, b; cin >> a >> b; --a; --b; to[a].push_back(b); to[b].push_back(a); } vector<vector<int>> dp(n, vector<int>(2)); auto dfs = [&](auto& f, int v, int p=-1) -> void { for (int u : to[v]) { if (u == p) continue; f(f, u, v); dp[v][0] += dp[u][1]; dp[v][1] += dp[u][0]+1; } }; dfs(dfs, 0); ll ans = (ll)(dp[0][0]+1) * dp[0][1]; cout << ans << '\n'; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现