Description

给定一棵带边权的树,选择两条没有公共边的简单路径(长度可以为0),使得所有在任意一条路径上的边的异或和尽量大。

Input

第一行一个数n表示点数,点的编号是0到n-1。
接下来一行(n-1)个数,第i个数表示编号为i的点的父亲编号,保证这个编号小于i。
接下来一行(n-1)个数,第i个数表示编号为i的点到它父亲的边的边权。

Output

输出一行一个数表示答案。

Sample Input

输入1:

9
0 0 2 2 4 4 5 6
13 16 12 11 3 1 4 2

输入2:

12
0 0 2 0 1 2 2 4 6 1 5
628 589 815 864 459 507 733 239 904 592 818

Sample Output

输出1:

31

样例解释1:

两条路径可以是4->6->8和0->2->3。

输出2:

1017

Data Constraint

对于50%的数据,n<=100。
对于100%的数据,n<=1000,边权均为不超过1000的非负整数。

Solution

  • 首先我们以每个点为根遍历这棵树一遍,记录可能的异或值。

  • 接着我们枚举两个可能的异或值,取其最大异或和即可。

  • 什么?万一两条路径是有重合的怎么办?

  • 其实没关系,因为这就相当于旁边两部分的异或和,并不会出错。

  • 具体如下图所示:

  • 时间复杂度 O(N2)O(N^2) 。

Code

#include<cstdio>
#include<cctype>
using namespace std;
const int N=1<<10;
int tot,ans;
int a[N],b[N];
int first[N],next[N<<1],en[N<<1],w[N<<1];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline void insert(int x,int y,int z)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;w[tot]=z;
}
inline void dfs(int x,int y,int z)
{a[z]=-1;for(int i=first[x];i;i=next[i])if(en[i]^y) dfs(en[i],x,z^w[i]);
}
int main()
{int n=read();for(int i=2;i<=n;i++) a[i]=read()+1;for(int i=2;i<=n;i++) b[i]=read();for(int i=2;i<=n;i++){insert(a[i],i,b[i]);insert(i,a[i],b[i]);}for(int i=1;i<=n;i++) dfs(i,0,0);tot=0;for(int i=N-1;i;i--)if(a[i]<0) b[++tot]=i;ans=b[1];for(int i=1;i<tot;i++)for(int j=i+1;j<=tot;j++)if((b[i]^b[j])>ans) ans=b[i]^b[j];printf("%d",ans);return 0;
}

JZOJ 5483. 【清华集训2017模拟11.26】简单路径相关推荐

  1. JZOJ 5484. 【清华集训2017模拟11.26】快乐树

    Description 一棵树有n个节点,编号为0到n-1.有一条叫Owaski的狗在树上面走,每一次它可以从一个顶点走到它的任何一个相邻顶点.每个顶点有个可正可负的快乐度,Owaski也有一个快乐度 ...

  2. JZOJ 5489. 【清华集训2017模拟11.28】海明距离

    Description 设有一长度为n的初始每个位置均为0的序列A.再给定一个长度为n的01序列B. 有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变. ...

  3. JZOJ 5490. 【清华集训2017模拟11.28】图染色

    Description Input 第一行包括两个整数N,M. 接下来M行每行两个整数u,v,代表存在一条里连接 u,v的无向边.可能存在重边自环. Output 降序输出所有不为0的F(i) .保留 ...

  4. jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥

    分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...

  5. JZOJ5498. 【清华集训2017模拟12.10】大佬的难题

    Sample Input Sample Input1: 4 201334450 1474105774 350932494 Sample Input2: 97670 1734691087 7596883 ...

  6. [JZOJ5498]【清华集训2017模拟12.10】大佬的难题

    Description 给出三个1~n的排列a,b,c 求 ∑1≤i,j≤n[ai<aj][bi<bj][ci<cj] \sum\limits_{1\leq i,j\leq n}[a ...

  7. 【清华集训2017模拟】Catalan

    Description 求Cnmod3814697265625(518)C_n \mod 3814697265625(5^{18})其中CnC_n为卡特兰数第n项 n<=10^18,T<= ...

  8. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  9. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

最新文章

  1. 前端抱怨 API 响应慢,怎么办?
  2. 一图胜千言!数据可视化多维讲解
  3. OracleHelper类
  4. Polycarp Recovers the Permutation 构造(1000)
  5. java7优化,七、索引优化分析
  6. 加减乘除html代码vb,VB做加减乘除的代码是什么啊? 或者是怎么做加减乘除 ?...
  7. Android—APT实践
  8. 数据结构之线段树进阶(区间更新lazy标记)
  9. JMetro版本4.8已发布
  10. Linux svn 查看项目的下载地址
  11. java.sql.SQLException: Field 'id' doesn't have a default value解决方法
  12. 玻璃质感_几何体素描画法:几何体画法步骤教程和玻璃质感画法教程,快学习...
  13. windows 下载 gcc
  14. android-GooglePlay上架
  15. php期末作业报告,期末作业(最终版).php
  16. 超级实用——用word与谷歌翻译将英文PDF文档翻译成中文,免费无限制之美
  17. 高观点下的数学:自然数
  18. shell循环loop
  19. 一个潜藏4年之久的内核bug
  20. 未正确自定义 View 导致 ViewBinding 使用 Crash:Missing required view with ID

热门文章

  1. 最邻近插值法(The nearest interpolation)实现图像缩放
  2. 交叉熵代价函数cross-entropy
  3. nginx动静分离和负载均衡
  4. Deeplearning 入门篇
  5. TMS320C6678上电配置和FPGA复位DSP
  6. oracle行级的触发器,Oracle触发器Trigger2行级
  7. 心电图多少为正常范围_研究:心跳超过70次/分,至少减寿3年!正常心率范围是多少?...
  8. 科大星云诗社动态20210905
  9. 【远程操控】Pycharm远程连接服务器之本地显示独立的plot窗口
  10. 网页上符号显示成方框_如何在word、PPT、Excel以及PDF中添加带√的方框