列表

详情


NC213148. 牛牛的路径和

描述

有一棵n个节点的树,每个节点都有一个价值p[i],对于某一条路径,定义路径的价值为路径上所有点的价值在二进制下按位与的值。求所有树上路径的价值和为多少
注意,单独的一个点也算一条路径。

输入描述

示例1

输入:

4,[0,1,2],[1,2,3],[1,2,2,1]

输出:

8

说明:

共有5条路径对答案有贡献,(1->2)贡献为2,(0)贡献为1,(1)贡献为2,(2)贡献为2,(3)贡献为1,所以答案为2+1+2+2+1=8。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 90ms, 内存消耗: 7644K, 提交时间: 2020-12-18 23:02:48

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
class Solution {
public:
	int fa[maxn],size[maxn];
	ll ans=0,tmp;
	int find(int x) {
		return x==fa[x]?x:(fa[x]=find(fa[x]));
	}
    long long solve(int n, vector<int>& u, vector<int>& v, vector<int>& p) {
        for(int i=0;i<=20;++i) {
        	for(int j=0;j<n;++j) fa[j]=j,size[j]=0;
        	
        	for(int j=0;j<n-1;++j) {
        		if( (p[u[j]]>>i&1)&&(p[v[j]]>>i&1) )
        			fa[find(u[j])]=find(v[j]);
			}
			
			for(int j=0;j<n;++j) size[find(j)]+=1;
			
			tmp=1<<i;
			for(int j=0;j<n;++j) if(fa[j]==j) {
				if(p[j]>>i&1)
				ans+=(size[j]+1)*size[j]/2*tmp;
			}
		}
		return ans;
    }
};

Go(1.14.4) 解法, 执行用时: 142ms, 内存消耗: 18156K, 提交时间: 2020-12-18 21:00:44

package main

// github.com/EndlessCheng/codeforces-go
func solve(n int, x, y, a []int) (s int64) {
	g := make([][]int, n)
	for i, v := range x {
		w := y[i]
		g[v] = append(g[v], w)
		g[w] = append(g[w], v)
	}
	for i := 0; i < 21; i++ {
		c := 0
		var f func(int, int) int
		f = func(v, p int) int {
			one := a[v] >> i & 1
			c += one
			for _, w := range g[v] {
				if w != p {
					o := f(w, v)
					if one > 0 {
						c += one * o
						one += o
					}
				}
			}
			return one
		}
		f(0, n)
		s += 1 << i * int64(c)
	}
	return
}

上一题