洛谷-P2420 让我们异或吧
Abstract
传送门
很有意思的一道题,需要巧妙的利用异或的结合律。
Idea
不妨取 1 为根节点,然后从 1 出发遍历整棵树,将 1 到 n 节点的路径异或和记录为 dis[i] ,那么,显然有从 i 到 j 的路径的异或和为 dis[i] ^ dis[j]。
Code
爱来自 namespace
#include <bits/stdc++.h>
int n, m;
namespace graph
{
const int maxn = 1100000;
struct Edge
{
int next, to, value;
} edge[maxn];
int head[maxn];
int cnt = 0;
void add(int u, int v, int c)
{
cnt++;
edge[cnt].next = head[u];
edge[cnt].to = v;
edge[cnt].value = c;
head[u] = cnt;
return;
}
int dis[maxn];
bool vis[maxn];
void dfs(int pos, int sum)
{
dis[pos] = sum;
vis[pos] = 1;
for (int i = head[pos]; i; i = edge[i].next)
{
if (vis[edge[i].to])
{
continue;
}
dfs(edge[i].to, sum ^ edge[i].value);
}
return;
}
};
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> n;
memset(graph::head, 0, sizeof graph::head);
memset(graph::vis, 0, sizeof graph::vis);
memset(graph::dis, 0, sizeof graph::dis);
for (int i = 1; i < n; i++)
{
int u, v, c;
std::cin >> u >> v >> c;
graph::add(u, v, c);
graph::add(v, u, c);
}
graph::dfs(1, 0);
std::cin >> m;
for (int i = 0; i < m; i++)
{
int x, y;
std::cin >> x >> y;
std::cout << (graph::dis[x] ^ graph::dis[y]) << std::endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】