首页 > 其他分享 >P8511 [Ynoi Easy Round 2021] TEST_68

P8511 [Ynoi Easy Round 2021] TEST_68

时间:2023-10-09 21:26:48浏览次数:46  
标签:int ll tr Ynoi trie 异或 P8511 68 mx

题目传送门

看到异或最大值,根据套路不妨考虑 \(0-1 trie\)。

通过 \(trie\) 找到异或值最大的点对 \((x,y)\)。那么除了 \((x,y)\) 到 \(1\) 路径上的点之外,其他的点的答案就是 \((x,y)\) 的异或值。

接下来考虑怎么算出这 \((x,y)\) 到 \(1\) 路径上的点的答案,可以直接暴力计算!

具体地,先清空原来的 \(trie\),将 \(x,y\) 分别向 \(1\) 号节点递归深,回溯的时候从 \(trie\) 中找到最大异或值,然后不断在 \(trie\) 中加入此时的节点和递归它其他的子节点并一一加入。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=500001,M=30000001;
int n,x,fa[N],p,q,vis[N];
ll a[N],b[N],maxn;
vector<int> g[N];
struct trie{int tr[M][2],to[M],tot=1,px=0,py=0;
	ll mx=0;
	void clear(){for(int i=1;i<=tot;i++)tr[i][0]=tr[i][1]=to[i]=0;
		tot=1,mx=0;
	}
	void add(int x){int p=1;
		for(int i=59;i>=0;i--){int u=(a[x]>>i)&1;
			if(!tr[p][u])tr[p][u]=++tot;
			p=tr[p][u];
		}
		to[p]=x,p=1;
		for(int i=59;i>=0;i--){int u=(a[x]>>i)&1;
			if(tr[p][u^1])p=tr[p][u^1];
			else if(tr[p][u])p=tr[p][u];
			else return;
		}
		if((a[x]^a[to[p]])>mx)px=x,py=to[p],mx=(a[px]^a[py]);
	}
}T;
void dfs(int u){T.add(u);
	for(int v:g[u])dfs(v);
}
void dfs1(int u,int f){if(!u) return;
	dfs1(fa[u],u),b[u]=T.mx,vis[u]=1,T.add(u);
	if(u!=f)for(int v:g[u])if(v!=f)dfs(v);
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=2;i<=n;i++)cin>>x,g[x].push_back(i),fa[i]=x;
	for(int i=1;i<=n;i++)cin>>a[i],T.add(i);
	p=T.px,q=T.py,maxn=T.mx,T.clear(),dfs1(p,p),T.clear(),dfs1(q,q);
	for(int i=1;i<=n;i++)cout<<(vis[i]?b[i]:maxn)<<'\n';
}

标签:int,ll,tr,Ynoi,trie,异或,P8511,68,mx
From: https://www.cnblogs.com/Exotic-sum/p/17753168.html

相关文章

  • 封装中内置了开关控制器的LTM4662EY/LTM4680EY/LTM4686IV DC/DC直流转换器
    1、LTM4662EY 双通道15ADC/DCμModule稳压器LTM4662是一款完整的双通道15A输出开关模式DC/DC电源。封装中内置了开关控制器、功率FET、电感器和所有的支持组件。该器件可在一个4.5V至20V的输入电压范围内工作,支持两个输出电压范围均为0.6V至5.5V(由外部电阻器设......
  • This kernel requires an x86-64 CPU, but only detected an i686CPU. Unable to boot
    原文链接:https://www.longkui.site/program/other/i686/4759/ 0.背景买了一台小电脑,STARTC-8080型号,想给他装个Linux系统。给他装Ubuntu18的时候,开始报错:Thiskernelrequiresanx86-64CPU,butonlydetectedani686CPU.Unabletoboot–pleaseuseakernelapp......
  • P7710 [Ynoi2077] stdmxeypz 题解
    P7710[Ynoi2077]stdmxeypz题解我的第一道Ynoi题,体验感不高,调了大半天,最后发现有个地方\(B_1\)写成\(B_2\)了。分析树上问题,明显是要转到树下的,所以DFS序是一定要求的。有关树上距离,所以\(deep\)数组也是一定要求的。所以我们现在把问题转化成了:给你三个序列\(......
  • 瑞芯微RK3568|SDK开发之Buildroot编译
    1. Buildroot手动编译1.1       Buildroot查询帮助查看buildroot的详细编译命令,如下所示。图1.1编译文件系统以上命令为,配置buildroot对应的默认配置defconfig,然后编译。注:buildroot编译只需留在SDK根目录下,不需要进入到buildroot文件夹内。 1.2       Bui......
  • Ynoi2012 NOIP2016 人生巅峰
    Day\(\text{XXX}\)。注意到修改是易于复合的立方操作,而且值域非常小,所以可以直接\(O(v\logm)\)预处理出对每个\(i\in[0,v)\)操作了\(2^{j}\lem\)次的结果,维护出每一位被修改了多少次,查询某一位的值直接倍增\(O(\logm)\)即可。然后这个限制很弱,因为如果区间内有重复......
  • 编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输
    for方法:[14:20:07root@centos8~]#catping_for.sh#!/bin/bash​#================================================================# Copyright(C)2021IEucdInc.Allrightsreserved.## 文件名称:ping_for.sh# 创建者:TanLiang# 创建日期:2021年10月17日# ......
  • jiaxun ynoi
    一天一道慢慢写着。因为菜所以一开始只有easyround。TEST_68简化一下限制。注意到很多点都能取到最大值,具体的,若最大值为\(x,y\)处取到,那么只有\(1\rightsquigarrowx,1\rightsquigarrowy\)路径上的点取不到。而一条链是非常好做的,直接dfs下来就行。时间复杂度\(\math......
  • 『题解』P9688
    题目传送门思路:设有两个颜色\(x_1x_2\),两端分别为\(l_1\)\(r_1\),\(l_2\)\(r_2\)。通过观察可以发现,若满足\(x_1<x_2\)且\(r_1>l_2\)则\(x_1x_2\)一定是单调不下降的。那么我们可以先预处理出一个颜色可以与前面的哪些颜色构成单调不下降,然后用dp求出最终答案......
  • P9688
    \(Solution\)考虑dp。观察数据范围,\(n,k\leq500\)的数据几乎明示了同阶下\(\Theta(n^3)\)的算法了。那么直接往这里考虑。设\(f_{i,j}\)为当前是第\(i\)中颜色,且已经选了\(j\)种颜色的最大值。那么有以下转移方程:\[f_{i,k}=\max^{i-1}_{j=1}cmp(i,j)\landf_{j,k......
  • P5682 [CSP-J 2019] 次大值
    题目描述传送门Alice有\(n\)个正整数,数字从\(1\simn\)编号,分别为\(a_1,a_2,\dots,a_n\)。Bob刚学习取模运算,于是便拿这\(n\)个数进行练习,他写下了所有\[a_i\bmoda_j(1\lei,j\len\wedgei\neqj)\]的值,其中\(\bmod\)表示取模运算。Alice想知道所有......