1.76KB 狂砍 45pts 求调
查看原帖
1.76KB 狂砍 45pts 求调
631576
CYZZ楼主2024/5/21 22:07
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 500005
int n;ll a[N];
int tot,head[N];
struct Edge{int next,to;}e[N<<1];
void add_edge(int u,int v){e[++tot]={head[u],v},head[u]=tot;}
namespace trie
{
	#define _ 60
	int idx=1,tr[N*_],ls[N*_],rs[N*_];
	void clear()
	{
		memset(ls,0,idx+1<<2);
		memset(rs,0,idx+1<<2);
		memset(tr,0,idx+1<<2);
		idx=1;
	}
	void insert(ll x,int id)
	{
		int p=1;
		for(int i=_;~i;i--)
		{
			int c=(x>>i&1),*nxt=c?(&rs[p]):(&ls[p]);
			if(!(*nxt)) *nxt=++idx;p=*nxt;
		}
		tr[p]=id;
	}
	pair<ll,int> query(ll x)
	{
		int p=1;ll ret=0;
		for(int i=_;~i;i--)
		{
			int c=(x>>i&1),*nxt=c?(&ls[p]):(&rs[p]),*ano=c?(&rs[p]):(&ls[p]);
			if(*nxt) ret|=(1ll<<i),p=*nxt;else p=*ano;
		}
		return {ret,tr[p]};
	}
}using namespace trie;
int fa[N],dep[N];
ll fans,ans;int U,V;
void dfs1(int u)
{
	insert(a[u],u);pair<ll,int> val=query(a[u]);
	if(val.first>ans) U=u,V=val.second,fans=val.first;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].to;fa[v]=u;
		dep[v]=dep[u]+1;dfs1(v);
	}
}
int lca,bk[N];
void LCA(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]) bk[x]=1,x=fa[x];
	while(x!=y) bk[x]=1,bk[y]=2,x=fa[x],y=fa[y];
	lca=x;while(x) bk[x]=3,x=fa[x];
}
ll Ans[N];
#define insrt(x) insert(a[x],x),ans=max(ans,query(a[x]).first)
void dfs2(int u,int flag)
{
	if(!bk[u]) Ans[u]=fans;
	if(bk[u]==flag||bk[u]==3) Ans[u]=ans;
	insrt(u);int son=0;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].to;
		if((bk[v]^flag)&&(bk[v]^3)) dfs2(v,flag);
		else son=v;
	}
	if(son) dfs2(son,flag);
}
int main()
{
	scanf("%d",&n);
	for(int i=2,x;i<=n;i++) scanf("%d",&x),add_edge(x,i);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	dfs1(1);LCA(U,V);
	clear();ans=0;dfs2(1,1);
	clear();ans=0;dfs2(1,2);
	for(int i=1;i<=n;i++) printf("%lld\n",Ans[i]);
}

评测记录

疑似过了链的测试点和 ai≤100a_i\le 100 的点。

2024/5/21 22:07
加载中...