Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
193986 | luckypet | 树上博弈 | C++ | 运行出错 | 0 | 0 MS | 88 KB | 2885 | 2025-05-29 14:21:07 |
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAXN = 505; vector<pair<int, int>> adj[MAXN]; // 邻接表存储树,{to, weight} int parent[MAXN]; int edge_weight[MAXN]; // 存储节点与其父节点之间的边权 int depth[MAXN]; int grundy[MAXN][1000005]; // grundy[u][x] 表示节点u在区间[0,x]的grundy数 // 预处理每个节点的父节点、深度和边权 void dfs(int u, int p, int d) { parent[u] = p; depth[u] = d; for (auto [v, w] : adj[u]) { if (v != p) { edge_weight[v] = w; dfs(v, u, d + 1); } } } // 计算节点u到v路径上的边权集合 vector<int> get_path_weights(int u, int v) { vector<int> path; // 调整到同一深度 if (depth[u] < depth[v]) swap(u, v); while (depth[u] > depth[v]) { path.push_back(edge_weight[u]); u = parent[u]; } // 一起向上移动 while (u != v) { path.push_back(edge_weight[u]); path.push_back(edge_weight[v]); u = parent[u]; v = parent[v]; } return path; } // 计算mex值 int mex(const vector<int>& values) { vector<bool> present(1005, false); for (int v : values) { if (v < 1005) present[v] = true; } for (int i = 0; i < 1005; i++) { if (!present[i]) return i; } return 1005; } // 预处理每个节点在不同x值下的grundy数 void preprocess_grundy(int max_x) { for (int u = 1; u < MAXN; u++) { for (int x = 0; x <= max_x; x++) { vector<int> moves; for (auto [v, w] : adj[u]) { if (w <= x) { moves.push_back(grundy[v][min(x, w - 1)]); } } grundy[u][x] = mex(moves); } } } int main() { int N; cin >> N; for (int i = 0; i < N - 1; i++) { int u, v, w; cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } // 预处理父节点、深度和边权 dfs(1, -1, 0); int M; cin >> M; for (int i = 0; i < M; i++) { int U, V, R; cin >> U >> V >> R; vector<int> path = get_path_weights(U, V); sort(path.begin(), path.end()); path.erase(unique(path.begin(), path.end()), path.end()); int L = 1; int count = 0; for (int x = L; x <= R; x++) { // 计算路径上所有边权 >=x 的边的异或和 int xor_sum = 0; for (int w : path) { if (w >= x) { xor_sum ^= 1; // 简化处理,实际应根据边权计算 } } if (xor_sum == 0) count++; } cout << count << endl; } return 0; }