1 条题解
-
3
#include <bits/stdc++.h> #define ll long long using namespace std; const int N=500005; int n,m,k,s,t,w[N],de[N],f[N][20],log2n,dis[N]; int num[10000005],ans[N]; vector<int> e[N]; struct node{ int val,id,o; }; vector<node> q[N]; int lca(int u,int v){ if (de[u]<de[v]) swap(u,v); for (int i=0,o=de[u]-de[v];o;++i,o>>=1) if (o&1) u=f[u][i]; if (u==v) return u; for (int j=log2n;j>=0;--j) if (f[u][j]!=f[v][j]) u=f[u][j],v=f[v][j]; return f[u][0]; } void dfs(int u){ for (int &v:e[u]){ if (v==f[u][0]) continue; de[v]=de[u]+1; dis[v]=w[v]^dis[u]; f[v][0]=u; dfs(v); } } void dfs1(int u){ num[w[u]]++; for (auto &i:q[u]){ ans[i.id]+=i.o*num[i.val]; } for (int &v:e[u]){ if (v==f[u][0]) continue; dfs1(v); } num[w[u]]--; } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>m; for (int i=1;i<=n;++i) cin>>w[i]; for (int i=1;i<n;++i){ cin>>s>>t; e[s].push_back(t); e[t].push_back(s); } dis[1]=w[1]; dfs(1); log2n=log2(n); for (int j=1;j<=log2n;++j) for (int i=1;i<=n;++i) f[i][j]=f[f[i][j-1]][j-1]; int u,v,p,val; for (int i=1;i<=m;++i){ cin>>u>>v>>k; p=lca(u,v); val=dis[u]^dis[v]^w[p]^k; if (val<=1e7){//不超过1e7 才进行查询,防止数组越界 q[u].push_back({val,i,1}); q[v].push_back({val,i,1}); q[f[p][0]].push_back({val,i,-2}); } } dfs1(1); for (int i=1;i<=m;++i) cout<<(ans[i]?"YES":"NO")<<"\n"; }
- 1
信息
- ID
- 344
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 68
- 已通过
- 21
- 上传者