社区讨论

20pts求调

P8511[Ynoi Easy Round 2021] TEST_68参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhj0xhkx
此快照首次捕获于
2025/11/03 18:55
4 个月前
此快照最后确认于
2025/11/03 18:55
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=3e7+5,M=3e7;
inline void read(int &a){
	char ch;int f=1,k=0;ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}
	a=k*f;
}
struct edge{
	int start,end;
}e[N];
int head[N],cnt;
inline void add(int u,int v){
	e[++cnt].end=v;
	e[cnt].start=head[u];
	head[u]=cnt;
}
int a[N],fa[N],n;
int p,q,mx,Lca,maxn,tot;

int t[M][2],idx,mark[N],ans[N];
inline void insert(int x){
	int p=0;
	for(int i=60;i>=1;i--){
		int c=(a[x]>>i)&1;
		if(!t[p][c]) t[p][c]=++idx;
		p=t[p][c];
	}
	mark[p]=x;
}
int query(int x){
	int p=0;
	for(int i=60;i>=1;i--){
		int c=(a[x]>>i)&1;
		if(t[p][c^1]) p=t[p][c^1];
		else p=t[p][c];
	}
	return mark[p];
}
inline void clear(){
	memset(t,0,sizeof(t));
	memset(mark,0,sizeof(mark));
	tot=maxn=idx=0;
}
int dep[N],tag[2][N];
inline void dfs1(int now){
	dep[now]=dep[fa[now]]+1;
	for(int i=head[now];i;i=e[i].start){
		int v=e[i].end;
		dfs1(v);
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	tag[0][x]=tag[1][y]=1;
	while(dep[x]>dep[y]) x=fa[x],tag[0][x]=1;
	if(x==y){return x;}
	while(x!=y) x=fa[x],y=fa[y],tag[0][x]=1,tag[1][y]=1;
	return x;
}
inline void lca_2(int now){
	while(now){
		tag[0][now]=tag[1][now]=1;
		now=fa[now];
	}
}
inline void dfs2(int now,int flg){
//	maxn[now]=max(maxn,a[query(now)]^a[now]);	
	if(tot>=2)ans[now]=max(ans[now],maxn);
	insert(now);tot++;
	if(tot>=2) maxn=max(maxn,a[query(now)]^a[now]);
	for(int i=head[now];i;i=e[i].start){
		int v=e[i].end;
		if(tag[flg][v]==0)
			dfs2(v,flg);
	}
	for(int i=head[now];i;i=e[i].start){
		int v=e[i].end;
		if(tag[flg][v]){
			tag[flg][v]=0;
			dfs2(v,flg);
			tag[flg][v]=1;
		}
	}
}
signed main(){
//	freopen("ex_var2.in","r",stdin);
//	freopen("ex_var2.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	read(n);
	for(int i=1;i<=n-1;i++){
		int v;read(v);
		add(v,i+1);
		fa[i+1]=v;
	}
	for(int i=1;i<=n;i++){
		read(a[i]);
		insert(i);
		int tmp=query(i);
		if((a[i]^a[tmp])>mx){
			p=tmp,q=i;
			mx=a[i]^a[tmp];
		}
	}
	dep[1]=1;dfs1(1);
	Lca=lca(p,q);lca_2(Lca);
//	for(int i=0;i<=1;i++){
//		for(int j=1;j<=n;j++){
//			cout<<tag[i][j]<<' ';
//		}
//		cout<<"\n";
//	}
	clear();dfs2(1,0);
	clear();dfs2(1,1);
	for(int i=1;i<=n;i++){
		if(i==1) cout<<0<<"\n";
		else if(tag[0][i]||tag[1][i]) cout<<ans[i]<<"\n";
		else cout<<mx<<"\n";
	}
	return 0;
}
/*
10
1 2 3 2 3 1 4 3 2 
10 9 8 7 6 5 6 7 11 13

20
1 2 2 3 5 2 6 3 2 4 5 9 13 12 9 15 7 10 7 
31 8 34 1 12 10 21 31 10 25 14 42 12 13 23 36 31 5 26 21 24 33 29 20 18


*/

回复

3 条回复,欢迎继续交流。

正在加载回复...