题目描述

A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一。每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征。

一些旅行者希望游览 A 国。旅行者计划乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国。在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上。然而,幸运是不能简单叠加的,这一点游览者也十分清楚。他们迷信着幸运数字是以异或的方式保留在自己身上的。

例如,游览者拍了 3 张照片,幸运值分别是 5,7,11,那么最终保留在自己身上的幸运值就是 9(5 xor 7 xor 11)。

有些聪明的游览者发现,只要选择性地进行拍照,便能获得更大的幸运值。例如在上述三个幸运值中,只选择 5 和 11 ,可以保留的幸运值为 14 。现在,一些游览者找到了聪明的你,希望你帮他们计算出在他们的行程安排中可以保留的最大幸运值是多少。

输入输出格式

输入格式:

第一行包含 2 个正整数 n ,q,分别表示城市的数量和旅行者数量。第二行包含 n 个非负整数,其中第 i 个整数 Gi 表示 i 号城市的幸运值。随后 n-1 行,每行包含两个正整数 x ,y,表示 x 号城市和 y 号城市之间有一条道路相连。随后 q 行,每行包含两个正整数 x ,y,表示这名旅行者的旅行计划是从 x 号城市到 y 号城市。N<=20000,Q<=200000,Gi<=2^60

输出格式:

输出需要包含 q 行,每行包含 1 个非负整数,表示这名旅行者可以保留的最大幸运值。

题意:

一棵树,节点有权值,求出一个节点到另一个节点的路径上的异或最大值。

题解:

①要求出多个数异或max还是用线性基好一点,用倍增加速线性基;

②先倍增预处理lca,同时预处理出lca移动路径上的节点线性基;

③查询先求出lca,然后像这样,类似于rmq的思想,暴力合并四个线性基:
aaarticlea/png;base64,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" alt="" />用一些位运算技巧可以算出每个数的最高二进制有效位数和线性基的sz(是否满)可以优化掉很多常数,但这样好像已经可以过了。

 #include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
const int N = ;
int n,m,f[N][],hd[N],o,lg[N],p[],lwt[N],dep[N];
ll w[N];
struct Edge{int v,nt;}E[*N];
int cal(ll x){
int ret=;
for(int i=;i;i>>=)if(x>>i)x>>=i,ret|=i;
return ret;
}
struct basis{
ll d[];
void ins(ll x){
for(int i = cal(x);i >= ;i--)
if((x>>i)&){
if(!d[i]) {d[i] = x;break;}
else x^=d[i];
}
}
ll mx(){
ll ret = ;
for(int i = ;i >= ;i--) if(d[i]) ret = max(ret,ret^d[i]);
return ret;
}
void merge(basis a){
for(int i = ;i >= ;i--) if(a.d[i]) ins(a.d[i]);
}
}Bs[N][],tmp;
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
ll rd(){
ll x = ; char c = gc();
while(c<''||c>'') c = gc();
while(c>=''&&c<='') x=x*+c-'',c = gc();
return x;
}
void adde(int u,int v){
E[o] = (Edge){v,hd[u]}; hd[u] = o++;
E[o] = (Edge){u,hd[v]}; hd[v] = o++;
}
void dfs(int u,int fa){
dep[u]=dep[fa]+; f[u][] = fa; Bs[u][].ins(w[fa]);
for(int i = ;i <= && p[i]<dep[u];i++){
f[u][i] = f[f[u][i-]][i-];
Bs[u][i] = Bs[u][i-];
Bs[u][i].merge(Bs[f[u][i-]][i-]);
}
for(int i = hd[u],v;i!=-;i=E[i].nt)if((v=E[i].v)!=fa) dfs(v,u);
}
int get(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i = dep[u]-dep[v];i;i-=lwt[i]) u = f[u][lg[lwt[i]]];
if(u==v) return u;
for(int i = ;i >= ;i--)if(f[u][i]!=f[v][i]){u = f[u][i]; v = f[v][i];}
return f[u][];
}
void query(int u,int v){
int lca = get(u,v);
memset(tmp.d,,sizeof(tmp.d));
tmp.ins(w[u]),tmp.ins(w[v]);
if(u!=lca){
int lu = dep[u] - dep[lca];
tmp.merge(Bs[u][lg[lu]]);
for(int i = lu-p[lg[lu]];i;i-=lwt[i]) u = f[u][lg[lwt[i]]];
tmp.merge(Bs[u][lg[lu]]);
}
if(v!=lca){
int lv = dep[v] - dep[lca];
tmp.merge(Bs[v][lg[lv]]);
for(int i = lv-p[lg[lv]];i;i-=lwt[i]) v = f[v][lg[lwt[i]]];
tmp.merge(Bs[v][lg[lv]]);
}
ll ans = tmp.mx();
printf("%lld\n",ans);
}
int main()
{ freopen("bzoj4568.in","r",stdin);
freopen("bzoj4568.out","w",stdout);
n = rd(); m = rd();
lg[] = -;
for(int i = ;i <= n;i++) w[i]=rd(),hd[i] = -,lg[i]=lg[i>>]+,lwt[i]=i&(-i);
for(int i = p[] = ;i <= ;i++) p[i] = p[i-]*;
for(int i = ;i < n;i++) adde(rd(),rd());
dfs(,);
for(int i = ;i <= m;i++) {
int u = rd(),v = rd();
query(u,v);
//printf("%d\n",i);
}
//printf("haha\n");
return ;
}//by tkys_Austin;

【bzoj4568 scoi2016】幸运数字的更多相关文章

  1. [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2131  Solved: 865[Submit][Statu ...

  2. [BZOJ4568][Scoi2016]幸运数字 倍增+线性基

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1791  Solved: 685[Submit][Statu ...

  3. bzoj4568: [Scoi2016]幸运数字(LCA+线性基)

    4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...

  4. 【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字

    板子题 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市 ...

  5. bzoj4568 [Scoi2016]幸运数字 线性基+树链剖分

    A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A ...

  6. BZOJ4568 [Scoi2016]幸运数字 【点分治 + 线性基】

    题目链接 BZOJ4568 题解 选任意个数异或和最大,使用线性基 线性基插入\(O(logn)\),合并\(O(log^2n)\) 我们要求树上两点间异或和最大值,由于合并是\(O(log^2n)\ ...

  7. BZOJ4568 : [Scoi2016]幸运数字

    树的点分治,每次求出重心后,求出重心到每个点路径上的数的线性基. 对于每个询问,只需要暴力合并两个线性基即可. 时间复杂度$O(60n\log n+60^2q)$. #include<cstdi ...

  8. 2019.03.25 bzoj4568: [Scoi2016]幸运数字(倍增+线性基)

    传送门 题意:给你一棵带点权的树,多次询问路径的最大异或和. 思路: 线性基上树?? 倍增维护一下就完了. 时间复杂度O(nlog3n)O(nlog^3n)O(nlog3n) 代码: #include ...

  9. BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)

    题意 题目链接 Sol 线性基是可以合并的 倍增维护一下 然后就做完了?? 喵喵喵? // luogu-judger-enable-o2 #include<bits/stdc++.h> # ...

  10. 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基

    [BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...

随机推荐

  1. 使用XIB的UITableViewCell自适应,以及出现的问题进行解决

    1.首先需要定义一个属性 @property (nonatomic, strong) UITableViewCell *prototypeCell; 2.在创建完tableView后加上如下代码 se ...

  2. Flask 学习 七 用户认证

    使用werkzeug 实现密码散列 from werkzeug.security import generate_password_hash,check_password_hash class Use ...

  3. nodeJS基于smtp发邮件

    邮件的协议smtp是tcp/ip族中的一个协议,所以我们这次考虑使用net模块来发送邮件. const net = require('net') const assert = require('ass ...

  4. LeetCode & Q27-Remove Element-Easy

    Array Two Pointers Description: Given an array and a value, remove all instances of that value in pl ...

  5. AngularJS1.X学习笔记8-自定义指令(上)

    AngulaJS的指令是一种非常强大的特性,一个ng-repeat就能让我们非常方便的展示一个数据列表,指令相当于是一个组件,为我们将一些东西封装起来了,提供了复用的可能性.个人认为自定义指令还是比较 ...

  6. Nagios监控的部署与配置

    [安装Nagios] yum install -y httpd httpd-devel httpd-tools mysql mysql-devel mysql-server php php-devel ...

  7. emqtt 试用(三)mqtt 知识

    一.概念 MQTT 协议客户端库: https://github.com/mqtt/mqtt.github.io/wiki/libraries 例如,mosquitto_sub/pub 命令行发布订阅 ...

  8. 译《Time, Clocks, and the Ordering of Events in a Distributed System》

    Motivation <Time, Clocks, and the Ordering of Events in a Distributed System>大概是在分布式领域被引用的最多的一 ...

  9. margin-top塌陷

    margin-top 塌陷 在两个不浮动的盒子嵌套时候,内部的盒子设置的margin-top会加到外边的盒子上,导致内部的盒子margin-top设置失败,解决方法如下: 1.外部盒子设置一个边框: ...

  10. python Django之Form组件

    python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...