题目描述

有一棵带权树,求这些边组成的路径的最大异或和。

Solution

考场 SPFA 神奇 70 分代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<ctime> const int MAXN=100010;
using namespace std; struct node{
int x,y,d,next;
}e[MAXN+MAXN+10];
int len=0;
int first[MAXN+10];
int n;
int ans=0;
queue<int> q;
int f[MAXN+10];
int sx,sy,sd;
bool v[MAXN+10]; void ins(int x,int y,int d){
e[++len].x=x;e[len].y=y;e[len].d=d;
e[len].next=first[x];first[x]=len;
}
int max(int x,int y){
if(x>y) return x;
return y;
}
int work(int X){
if(clock()>950) return 0;
memset(f,0,sizeof(f));
while(!q.empty()) q.pop();
q.push(X);
while(!q.empty()){
int x=q.front();q.pop();v[x]=0;
for(int i=first[x];i;i=e[i].next){
int y=e[i].y;
if((f[y]<(f[x]^e[i].d))&&y!=X&&v[y]){
v[y]=0;
f[y]=(f[x]^e[i].d);
q.push(y);
}
}
v[x]=1;
}
int sum=0;
for(int i=1;i<=n;++i)
if(i!=X) sum=max(sum,f[i]);
return sum;
}
inline int read(){
int x=0; char c;
do c=getchar(); while(c<'0'||c>'9');
while(c>='0'&&c<='9')
x=x*10+c-48,c=getchar();
return x;
}
int main(){
freopen("xor.in","r",stdin);
freopen("xor.out","w",stdout);
n=read();
memset(first,0,sizeof(first));
memset(v,1,sizeof(v));
for(int i=1;i<n;++i){
sx=read();sy=read();sd=read();
ins(sx,sy,sd);ins(sy,sx,sd);
}
for(int i=1;i<=n;++i)
ans=max(ans,work(i));
printf("%d",ans);
}

你现在选出了一个点,你要在剩下的 n−1n-1n−1 个中找一个点使异或最大。

假设你第一位是 0,那你肯定想找个 1 对吧。这样一直做下去就是答案。于是我们想到了 trie 树。把根到每个点的距离做出来,加进 trie 树里面,然后做一次的复杂度就是 log⁡n\log nlogn 的,总的复杂度就是 O(nlog⁡n)O(n\log n)O(nlogn) 的。

#include<cstdio>
#include<cstdlib>
#include<cstring> #define reg register typedef long long ll; int n;
ll a[100010];
ll pow[35]={1};
struct node{
int x,fa,h,s[2];
}e[3300010];
int len=0;
ll ans=-1; ll max(ll x,ll y) {
return x>y?x:y;
}
inline ll read(){
ll x=0;char c;
do c=getchar(); while(c<'0'||c>'9');
while(c>='0'&&c<='9')
x=x*10+c-48,c=getchar();
return x;
}
void ins(ll x,int root){
if(e[root].h<=0) return;
ll yy=pow[e[root].h-1],xx=bool(x>=yy);
if(!e[root].s[xx]){
e[root].s[xx]=++len;
e[len].fa=root;e[len].h=e[root].h-1;e[len].x=xx;
}
ins(x-(xx?yy:0),e[root].s[xx]);
}
ll query(int x){
ll sum=0,tf=1;
for(reg int i=0;;){
if(!i&&!tf) break;
if(!i&&tf) tf=0;
if(pow[e[i].h-1]<=x){
x-=pow[e[i].h-1];
if(e[i].s[0]){
sum+=pow[e[i].h-1];
i=e[i].s[0];
continue;
}
else
i=e[i].s[1];
}
else{
if(e[i].s[1]){
sum+=pow[e[i].h-1];
i=e[i].s[1];
continue;
}
else
i=e[i].s[0];
}
}
return sum;
}
int main(){
memset(e,0,sizeof(e));
for(reg int i=1;i<=31;++i)
pow[i]=pow[i-1]*2l;
e[0].h=31;
scanf("%d",&n);
for(reg int i=1;i<=n;++i){
a[i]=read();
ins(a[i],0);
if(i!=1) ans=max(ans,query(a[i]));
}
printf("%lld",ans);
}

#10056. 「一本通 2.3 练习 5」The XOR-longest Path的更多相关文章

  1. 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie

    题目描述 在给定的 $N$ 个整数 $A_1,A_2,A_3...A_n$ 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数$N$. 第二行$N$个整数$A_i$. 输出格式 ...

  2. 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie

    #10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...

  3. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  4. LOJ#10117. 「一本通 4.1 练习 2」简单题

    LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...

  5. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  6. 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map

    题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望 ...

  7. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  8. 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集

    题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...

  9. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

随机推荐

  1. charles 禁用Cookies /Block Cookies Settings

    本文参考:charles 禁用Cookies 禁用cookies/Block Cookies Settings 功能:阻止发送和接收Cookie 禁用Cookie工具 禁用Cookie工具阻止发送和接 ...

  2. 一个基于vue的时钟

    前两天写了一个基于vue的小钟表,给大家分享一下. 其中时针和分针使用的是图片,结合transform制作:表盘刻度是通过transform和transformOrigin配合画的:外面的弧形框框,啊 ...

  3. MySQL索引&&开发规范

    规范总结 索引规范 默认添加的索引都是BTree索引.Innodb只支持BTree索引. 设计索引原则 - 最适合索引的列是WHERE子句中的列,而不是SELECT中的列. - 如果索引的字段很长,使 ...

  4. MOOC C++笔记(二):类和对象基础

    第二周:类和对象基础 面向对象程序设计的四个基本特点 抽象.封装.继承.多态. 面向对象程序设计的过程 1.从客观事物抽象出类 抽象出的事物带有成员函数与成员变量(类似于带函数的结构体) 成员变量和成 ...

  5. (转)在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境

    阿里云的云服务器(ECS)可以选择多种操作系统,打算用它运行 Drupal或者 WordPress ,你最好选择 Linux 系统,这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器.我们在 ...

  6. java自学小测试 九九乘法表

    public class Ninenine { public static void main(String[] args) { for(int i=1;i<=9;i++){ for(int j ...

  7. 怎样用手机把视频变成GIF表情包?原来那么简单,网友:看完涨知识了

    现如今表情包几乎成了,我们手机聊天的必需品了.不过相比于普通表情包,大家更喜欢用GIF表情包,因为动图表情包不仅更加搞笑,而且能更形象的表达我们的情绪.比较有想法的朋友甚至想自己制作GIF表情包,但是 ...

  8. 波士顿房价预测 - 最简单入门机器学习 - Jupyter

    机器学习入门项目分享 - 波士顿房价预测 该分享源于Udacity机器学习进阶中的一个mini作业项目,用于入门非常合适,刨除了繁琐的部分,保留了最关键.基本的步骤,能够对机器学习基本流程有一个最清晰 ...

  9. python教程 - 猿说python

    一.简介         知识改变命运,程序改变世界.互联网时代潜移默化的改变着我们的生活,伴随技术的进步,我想下一个时代应该属于人工智能和机器学习,属于python.           pytho ...

  10. 阿里云服务器CentOS6.9 tomcat配置域名访问

    之前一直是ip访问项目,今天申请到一个测试域名,想要用设置用域名访问项目. 1.进入阿里云服务器中,修改tomcat中server.xml文件 cd /usr/local/apache-tomcat/ ...