题意:
给定一个树,每个点上有一个点权,计算
题解:
使用dsu on tree,把每个数拆开成二进制,存在数组上,在合并的时候统计答案
dsu on tree还有一个小trick就是,可以预处理出整棵树的dfs序,每次遍历一棵子树的时候直接遍历数组而不用递归可以略微快一点
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll rd(){
ll x=0;char o,f=1;
while(o=getchar(),o<48)if(o==45)f=-f;
do x=(x<<3)+(x<<1)+(o^48);
while(o=getchar(),o>47);
return x*f;
}
const int maxn=1e5+5;
const ll mod=998244353;
const int B=17;
int head[maxn],tot;
struct nn{
int v,nxt;}g[maxn<<1];
void add_edge(int u,int v){
g[++tot]={
v,head[u]