TLE50pts求助
查看原帖
TLE50pts求助
763878
Jerry_heng楼主2024/12/30 17:42
//2024-12-30 14:52:15
#include<bits/stdc++.h>
#define db double
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
#define ll long long
using namespace std;
bool MBE;
inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f; 
}
const int mxn=5e5+10;
int p1[mxn],p2[mxn],n,cnt=1,ch[mxn*60][2],cnt1,cnt2,num[mxn],fa[mxn];
ll mx=0,a[mxn],anss[mxn];
bool vis[mxn];
vector<int>E[mxn];
pii ans;
void insert(ll x,int id){
	int now=1;
	for(int i=59;i>=0;i--){
		ll pos=(x>>(i*1ll))&1ll;
		if(!ch[now][pos])ch[now][pos]=++cnt;
		now=ch[now][pos];
	}
	num[now]=id;
}
void query(ll x,int id){
	int now=1;
	ll s=0;
	for(int i=59;i>=0;i--){
		ll pos=(x>>(i*1ll))&1ll;
		if(!ch[now][pos^1])now=ch[now][pos];
		else now=ch[now][pos^1],s+=(1ll<<i);
	}
	if(s>mx)mx=s,ans=mkp(num[now],id);
}
void dfs(int u){
	insert(a[u],u);
	query(a[u],u);
	for(int v:E[u])
		dfs(v);
}
void init(){
	for(int i=1;i<=cnt;i++)
		ch[i][0]=ch[i][1]=num[i]=0;
	cnt=1;mx=0;
}
void solve(int u,int now,int *p,bool op){
	if(op)anss[u]=mx;
	insert(a[u],u);
	query(a[u],u);
	if(!op){
		for(int v:E[u])
			solve(v,now,p,0);
		return;
	}
	if(now==1)return;
	for(int v:E[u])
		if(v!=p[now-1])solve(v,now-1,p,0);
	solve(p[now-1],now-1,p,1);
}
signed main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    n=read();
    for(int i=2;i<=n;i++){
    	fa[i]=read();
    	E[fa[i]].eb(i);
    }
    for(int i=1;i<=n;i++)
    	scanf("%lld",&a[i]);
    dfs(1);
    int u=ans.fi,v=ans.se;
    int x=u,y=v;
    while(x){
    	p1[++cnt1]=x;
    	x=fa[x];
    	vis[x]=1;
    }
    while(y){
    	p2[++cnt2]=y;
    	y=fa[y];
    	vis[y]=1;
    }
    for(int i=1;i<=n;i++)
    	if(!vis[i])anss[i]=mx;
    init();
    solve(1,cnt1,p1,1);
    init();
    solve(1,cnt2,p2,1);
    for(int i=1;i<=n;i++)
    	printf("%lld\n",anss[i]);
    bool MED;
    cerr<<(&MED-&MBE)/1048576.0<<" MB, "<<1000*clock()/CLOCKS_PER_SEC<<" ms\n";
    return 0;
}
2024/12/30 17:42
加载中...