http://poj.org/problem?id=3764 (题目链接)

今天的考试题,看到异或就有点虚,根本没往正解上想。。

题意

  给出一棵带权树,请找出树上的一条路径,使其边上权值的异或和最大。

solution

  首先我们考虑从根向下dfs,记录下每个点i到根上权值的异或和${val[i]}$。根据异或和的性质:${x~Xor~y~Xor~y=x}$。所以我们可以由${val}$数组两两组合得出树上任意两点之间路径的异或和。(不理解请自己脑补OvO)

  然而这样对于时间复杂度并没有提高,仍然需要枚举两点。所以我们考虑从异或这个运算的本质下手。要使两个数的异或和尽可能大,那么这两个数的二进制高位的数就要尽可能不同。其实这是贪心思想,对于每一个${val[i]}$,我们把它拆成二进制数,由高位向低位,尽可能使当前位上的数与${val[i]}$当前位上的数不同(这样对答案的贡献最大)。

  对于这样一个算法,我们可以用trie树维护。根据深度建树30层,每一个节点的儿子就是${0}$和${1}$,表示有没有一个${val[i]}$在这一位存在${0}$或${1}$。这样就很好的解决了问题。复杂度${O(n*30)}$。

代码

// poj3764
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#define MOD 1000000007
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
struct edge {int to,next,w;}e[maxn<<1];
int vis[maxn],val[maxn],bin[maxn],tr[maxn<<4][2],head[maxn],cnt,sz,n; void link(int u,int v,int w) {
e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].w=w;
e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt;e[cnt].w=w;
}
void dfs(int u,int w) {
vis[u]=1;
for (int i=head[u];i;i=e[i].next) if (!vis[e[i].to])
dfs(e[i].to,w^e[i].w);
val[u]=w;
}
void insert(int x) {
int u=0;
for (int i=30;i>=0;i--) {
int k=x&bin[i];k>>=i;
if (!tr[u][k]) tr[u][k]=++sz;
u=tr[u][k];
}
}
int main() {
bin[0]=1;for (int i=1;i<=30;i++) bin[i]=bin[i-1]<<1;
while (scanf("%d",&n)!=EOF) {
cnt=sz=0;
memset(vis,0,sizeof(vis));memset(head,0,sizeof(head));
memset(tr,0,sizeof(tr));
for (int u,v,w,i=1;i<n;i++) {
scanf("%d%d%d",&u,&v,&w);
u++,v++; //因为节点编号是从0开始,所以全部+1
link(u,v,w);
}
dfs(1,0);
for (int i=1;i<=n;i++) insert(val[i]);
int ans=0;
for (int i=0;i<=n;i++) {
int u=0,x=val[i],s=0;
for (int j=30;j>=0;j--) {
int k=x&bin[j];k>>=j;
if (tr[u][k^1]) s+=bin[j],u=tr[u][k^1];
else u=tr[u][k];
}
ans=max(ans,s);
}
printf("%d\n",ans);
}
return 0;
}

  

  

【poj3764】 The xor-longest Path的更多相关文章

  1. 【BZOJ2337】[HNOI2011]XOR和路径 期望DP+高斯消元

    [BZOJ2337][HNOI2011]XOR和路径 Description 题解:异或的期望不好搞?我们考虑按位拆分一下. 我们设f[i]表示到达i后,还要走过的路径在当前位上的异或值得期望是多少( ...

  2. 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS

    [BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...

  3. 【BZOJ4269】再见Xor 高斯消元

    [BZOJ4269]再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整 ...

  4. 【bzoj4296】再见Xor

    4269: 再见Xor Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 176  Solved: 107[Submit][Status][Discuss ...

  5. 【bzoj2115】[Wc2011] Xor

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2512  Solved: 1049[Submit][Status ...

  6. 【Trie】The XOR Largest Pair

    [题目链接] https://loj.ac/problem/10050 [题意] 给出n个数,其中取出两个数来,让其异或值最大. [题解] 经典的01字典树问题. 首先需要把01字典树建出来. 然后对 ...

  7. poj3764 The XOR Longest Path【dfs】【Trie树】

    The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10038   Accepted:  ...

  8. 题解 bzoj1954【Pku3764 The xor – longest Path】

    做该题之前,至少要先会做这道题. 记 \(d[u]\) 表示 \(1\) 到 \(u\) 简单路径的异或和,该数组可以通过一次遍历求得. \(~\) 考虑 \(u\) 到 \(v\) 简单路径的异或和 ...

  9. 【poj3764】The xor-longest Path

    The xor-longest Path Description In an edge-weighted tree, the xor-length of a path p is defined as ...

随机推荐

  1. Javascript 代码格式化(JsFormat)

    JsFormat 在GitHub 上的地址: https://github.com/jdc0589/JsFormat 这是一个sublime text 2 的插件. 安装: 先安装 sublime p ...

  2. 轉發XML

    Delphi 中的 XMLDocument 类详解(3) - 读取 xml 文件 先虚拟一个测试文件: test.xml; 放在 c:\temp\ 下备用. <?xml version=&quo ...

  3. 如何将matlab画出的图片保存为要求精度

    · 来源:http://emuch.net/bbs/viewthread.php?tid=2705843 杂志社对投稿图片的分辨率通常有如下要求: TIFF: Colour or greyscale ...

  4. mysql 判断 字段是否为空

    SB.Append("select "); SB.Append("mpe.EVIDENCE_ID "); SB.Append("left join m ...

  5. BZOJ 1030 【JSOI2007】 文本生成器

    Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...

  6. SharePoint 2010自定义母版页小技巧——JavaScript和CSS引用

    通常在我们的项目中,都会涉及到母版页的定制.并且必不可少的,需要配合以一套自己的JavaScript框架和CSS样式.你有没有遇到过这样的情况呢,在开发环境和UAT时都还算顺利,但是当最终部署到生产服 ...

  7. Silverlight调用本机exe程序

    要点: 1. Silverlight必须启用OOB模式,以及 Require elevated trust when running in-browser.参考下图设置 注:OOB模式,并不意味着必须 ...

  8. mac上如何卸载oracle jdk 1.7

    目前mac上有一些软件还不支持jdk1.7,只能卸载1.7,恢复到1.6,下面二个链接是官网给出的卸载方法: http://www.java.com/zh_CN/download/help/mac_u ...

  9. Hibernate3.3.2 手动配置annotation环境

    简单记录Hibernate3.3.2如何快速配置环境 一.下载hibernate-distribution-3.3.2.GA-dist.zip文件,建立User libraries. 打开window ...

  10. 用jQuery File Upload做的上传控件demo,支持同页面多个上传按钮

    需求 有这么一个需求,一个form有多个文件要上传,但又不是传统的图片批量上传那种,是类似下图这种需求,一开始是用的swfupload做的上传,但是问题是如果有多个按钮的话,就要写很多重复的代码,于为 ...