欢迎参加——每周六晚的BestCoder(有米!) |
CRB and TreeTime Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 607 Accepted Submission(s): 194
Problem Description
CRB has a tree, whose vertices are labeled by 1, 2, …,
N . They are connected by
N – 1 edges. Each edge has a weight.
For any two vertices u and v (possibly equal), f(u,v) is xor(exclusive-or) sum of weights of all edges on the path from u to v . CRB’s task is for given s , to calculate the number of unordered pairs (u,v) such that f(u,v) = s . Can you help him?
Input
There are multiple test cases. The first line of input contains an integer
T , indicating the number of test cases. For each test case:
The first line contains an integer N denoting the number of vertices. Each of the next N - 1 lines contains three space separated integers a , b and c denoting an edge between a and b , whose weight is c . The next line contains an integer Q denoting the number of queries. Each of the next Q lines contains a single integer s . 1 ≤ T ≤ 25 1 ≤ N ≤ 105 1 ≤ Q ≤ 10 1 ≤ a , b ≤ N 0 ≤ c , s ≤ 105 It is guaranteed that given edges form a tree.
Output
For each query, output one line containing the answer.
Sample Input
Sample Output
Author
KUT(DPRK)
Source
2015 Multi-University Training Contest 10
Recommend
wange2014 | We have carefully selected several similar problems for you: 5416 5415 5414 5413 5412
|
#include <cstdio> #include <cstring> #include <iostream> #include <set> using namespace std; #define LL long long #define N 100000 + 10 int n, q, s, T; int head[N], tot; int m[2 * N]; int dist[N]; struct edge { int v, w, next; }e[2 * N]; void init() { tot = 0; memset(head, -1, sizeof head); memset(m, 0, sizeof m); } void adde(int u, int v, int w) { e[tot].v = v; e[tot].w = w; e[tot].next = head[u]; head[u] = tot++; } void dfs(int u, int fa, int val) { dist[u] = val; m[val]++; for(int i = head[u]; i != -1; i = e[i].next) { int v = e[i].v; if(v == fa) continue; dfs(v, u, val ^ e[i].w); } } void solve() { LL ans = 0; int j ; for(int i = 1; i <= n; i++) { j = dist[i] ^ s; if(j == dist[i]) ans += m[j] - 1; else ans += m[j]; } ans /= 2; if(s == 0) ans += n; printf("%I64d\n", ans); } int main() { scanf("%d", &T); while(T--) { scanf("%d", &n); init(); int u, v, w; for(int i = 1; i < n; i++) { scanf("%d%d%d", &u, &v, &w); adde(u, v, w); adde(v, u, w); } dfs(1, -1, 0); scanf("%d", &q); for(int i = 0; i < q; i++) { scanf("%d", &s); solve(); } } return 0; } /* 1 3 1 2 1 2 3 2 3 2 3 4 1 5 1 2 1 3 5 2 1 3 2 2 4 2 10 0 3 2 */