社区讨论
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 条回复,欢迎继续交流。
正在加载回复...