1 条题解

  • 0
    @ 2023-9-20 9:26:11

    image

    #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
    上传者