1 条题解
-
0
#include <bits/stdc++.h> #define ll long long #define P 998244353 using namespace std; const int N=500005; int n,m,k,s,t,fa[N],b[N],tt; ll a[N],mx=-1,ans[N]; vector<int> e[N]; struct node{//Trie int a[N*60][2],b[N*60],tot=1; void clear(){ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); tot=1; } void insert(ll k,int id){ int p=1; for (int i=59;i>=0;--i){ int o=((k>>i)&1); if (!a[p][o]) a[p][o]=++tot; p=a[p][o]; } b[p]=id; } void find(ll k,int id){ int p=1;ll x=0; for (int i=59;i>=0;--i){ int o=((k>>i)&1); if (a[p][o^1]) p=a[p][o^1],x=(x<<1)+1; else p=a[p][o],x<<=1; } if (b[p] && x>mx){ mx=x;s=b[p];t=id; } } }T; void dfs(int u,int o){//遍历以u为根的子树,但不去o T.find(a[u],u); T.insert(a[u],u); for (int &v:e[u]) if (v!=fa[u] && v!=o){ dfs(v,o); } } void calc(int s){ tt=0; for (;;s=fa[s]){ b[++tt]=s; if (s==1) break; } T.clear(); mx=0; for (int i=tt;i>=1;--i){ ans[b[i]]=mx; if (i!=1) dfs(b[i],b[i-1]); } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); cin>>n; for (int i=2;i<=n;++i){ cin>>s;fa[i]=s; e[s].push_back(i); } for (int i=1;i<=n;++i) { cin>>a[i];//权值 T.find(a[i],i); T.insert(a[i],i); } for (int i=1;i<=n;++i) ans[i]=mx; int _t=t; calc(s); calc(_t); for (int i=1;i<=n;++i) cout<<ans[i]<<'\n'; }
- 1
信息
- ID
- 496
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 27
- 已通过
- 13
- 上传者