Div.2.E LuoTianyi and XOR-Tree Solution
Statement
给定一棵
Solution
可以先弱化问题为让各条叶子路径异或相等的代价,再对根进行调整。直接考虑树形 dp,
设
用 set 维护集合,map 维护出现次数,启发式合并 set,复杂度
code
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=1e5+10;
int n,a[maxn],f[maxn];
vector<int>e[maxn];
set<int>s[maxn];
inline void dfs(int x,int fa,int oplus)
{
map<int,int>cnt;int mx=0;
if(e[x].size()==1 && x!=1) return s[x].insert(oplus),f[x]=0,void();
for(auto y:e[x]) if(y!=fa)
{
dfs(y,x,oplus^a[y]),f[x]+=(f[y]+1);
if(s[x].size()<s[y].size()) swap(s[x],s[y]);
for(auto v:s[y]) if(s[x].count(v)) cnt[v]++; else s[x].insert(v);
}
if(!cnt.empty())
{
for(auto [num,ct]:cnt) mx=max(mx,ct);
f[x]-=(mx+1),s[x].clear();
for(auto [num,ct]:cnt) if(ct==mx) s[x].insert(num);
}
else f[x]--;
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(NULL);
cin>>n; for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1,x,y;i<n;i++) cin>>x>>y,e[x].pb(y),e[y].pb(x);
dfs(1,0,a[1]),cout<<f[1]+(!s[1].count(0));
return 0;
}