3 条题解
-
2
//考虑两个相同的数异或为0 //所以dis(x,y)=dis(1,x)^dis(1,y) //直接01trie维护就好了 #include<bits/stdc++.h> using namespace std; const int N=1e6+5; vector<int> e[N],g[N]; int n,k,tr[N*30][2],s[N*30],tot=1; long long sum; void add(int x){ int now=1; for(int i=30;i>=0;i--){ s[now]++; int p=(x>>i)&1; if(!tr[now][p])tr[now][p]=++tot; now=tr[now][p]; } s[now]++; } int ask(int x){ int now=1,ans=0; for(int i=30;i>=0;i--){ int p=(x>>i)&1; int q=(k>>i)&1; if(q==0) ans+=s[tr[now][p^1]],now=tr[now][p]; else now=tr[now][p^1]; } return ans+s[now]; } void dfs(int x,int fa,int s){ sum+=ask(s); add(s); for(int i=0;i<e[x].size();i++){ int y=e[x][i],z=g[x][i]; if(y==fa)continue; dfs(y,x,s^z); } } int main(){ scanf("%d%d",&n,&k); for(int i=1;i<n;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); e[x].push_back(y),g[x].push_back(z); e[y].push_back(x),g[y].push_back(z); } dfs(1,0,0); printf("%lld",sum); return 0; }
信息
- ID
- 93
- 时间
- 2500ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 1853
- 已通过
- 122
- 上传者