POJ 3764 The xor-longest Path

      这道题做得就是一个悲剧。做这道题需要的能力我是达不到的,但感觉有思路,还是做了,当提交的结果不断是是RT、WS、TLE时,盲目的修改,换来的更多是错误,缺乏对这道题整体的理解,有错误时也不知哪儿错了。

      这道题要求最长的异或路径:就是在树中找两个节点,两个节点间有唯一路径(因为是树),把路径不断做异或,异或完后求最大的。数据是10万,O(n2)算法超时。我们知道异或有这样的性质:a^b = (a^c)^(b^c),这样就可以考虑找出a与b公共的c,实际上就是求出从根节点到每个节点的异或值,这样任意两个点做异或,即是他们之间的异或路径(相同部分异或抵消了)。可以dfs遍历一遍,我在这里就花了很多时间,用邻接表表示树用的很少,很不熟练。然后可以用字典树来储存每个节点的值,问题又转化成求这n个数中,任意两个数做异或,求最大值,用字典树的复杂度为O(n*31),前面dfs复杂度为O(n),所以效率还是比较好的。程序中注意优化,否则TLE,例如:u、v节点,u可能比v大,我们就交换它们来建邻接点,而不必建两次。

      这道题虽然通过率比较低,但并没有什么trap,只是自己对整道题整体把握不好,以后做题要考虑全面,否则这样的教训还会出现。

程序代码:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值