https://www.lydsy.com/JudgeOnline/problem.php?id=4568

https://www.luogu.org/problemnew/show/P3292

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

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

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

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

学会了st表求线性基的方法。

我们可以将一个线性基内的东西全部扔到另一个线性基里面,就是一种合并了。

然后就没有了,LCA求顺带着合并线性基即可。

(其实实际上这是一道码农题。)

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
#include<cctype>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=20010;
const int BASE=60;
const int LOGN=15;
inline ll read(){ll 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;
}
struct node{int to,nxt;
}e[N*2];
struct basis{ll c[BASE+2];
}b[N][LOGN+2];
int n,q,cnt,head[N],dep[N];
int anc[N][LOGN+2];
inline void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
void ins(ll k,basis &a){for(int i=BASE;i>=0;i--)if(k>>i&1)if(a.c[i])k^=a.c[i];else{a.c[i]=k;break;}
}
basis merge(basis a,basis b){for(int i=BASE;i>=0;i--)if(b.c[i])ins(b.c[i],a);return a;
}
void dfs(int u){dep[u]=dep[anc[u][0]]+1;for(int i=1;i<=LOGN;i++){anc[u][i]=anc[anc[u][i-1]][i-1];b[u][i]=merge(b[u][i-1],b[anc[u][i-1]][i-1]);}for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v!=anc[u][0]){anc[v][0]=u;dfs(v);}}
}
ll getans(basis a){ll ans=0;for(int i=BASE;i>=0;i--)ans=max(ans,ans^a.c[i]);return ans;
}
ll query(int i,int j){static basis t1,t2;memset(t1.c,0,sizeof(t1.c));memset(t2.c,0,sizeof(t2.c));if(dep[i]<dep[j])swap(i,j);for(int k=LOGN;k>=0;k--){if(dep[anc[i][k]]>=dep[j]){t1=merge(t1,b[i][k]);i=anc[i][k];}}if(i==j)return getans(merge(t1,b[i][0]));for(int k=LOGN;k>=0;k--){if(anc[i][k]!=anc[j][k]){t1=merge(t1,b[i][k]);t2=merge(t2,b[j][k]);i=anc[i][k],j=anc[j][k];}}t1=merge(t1,b[i][0]);t2=merge(t2,b[j][0]);return getans(merge(merge(t1,t2),b[anc[i][0]][0]));
}
int main(){n=read(),q=read();for(int i=1;i<=n;i++)ins(read(),b[i][0]);for(int i=1;i<n;i++){int u=read(),v=read();add(u,v);add(v,u);}dfs(1);for(int i=1;i<=q;i++){int u=read(),v=read();printf("%lld\n",query(u,v));}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8822674.html

BZOJ4568:[SCOI2016]幸运数字——题解相关推荐

  1. Bzoj4568: [Scoi2016]幸运数字

    Bzoj4568: [Scoi2016]幸运数字 线性基+倍增+LCA 原来线性基还能这么考--一开始看到这个题以为是树上差分线性基,然而线性基不支持删除,所以就挂了. 后来想到倍增线性基,其实到这里 ...

  2. BZOJ4568 [Scoi2016]幸运数字

    BZOJ4568 [Scoi2016]幸运数字 题目描述 传送门 题目分析 这个题,求树上链的\(XOR\)最大值,可以不选某些点. 考虑到线性基可以用很快的速度求出\(XOR\)的最大值,我们首先可 ...

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

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

  4. [bzoj4568][Scoi2016]幸运数字

    来自FallDream的博客,未经允许,请勿转载,谢谢. A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这 ...

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

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

  6. BZOJ4568 : [Scoi2016]幸运数字

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

  7. [洛谷P3292] [SCOI2016]幸运数字

    洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...

  8. P3292 [SCOI2016]幸运数字(树剖 + 线段树维护线性基)

    P3292 [SCOI2016]幸运数字 思路 如果这题是求x,yx, yx,y之间的距离显然我们可以通过树剖加线段树来写, 但是这里变成了求任意个数的异或最大值.如果给定区间我们显然可以通过线性基来 ...

  9. bzoj 4568: [Scoi2016]幸运数字(树上倍增+线性基)

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MB Submit: 1692  Solved: 643 [Submit][Sta ...

最新文章

  1. 视觉语言研究进展到哪了?CVPR2021视觉语言研究全面概述,附430页ppt
  2. 转: 理解AngularJS中的依赖注入
  3. JBPM4.4与SSH2的整合
  4. Android studio Merge 标签 显示错乱
  5. 装饰模式(Decorator)简介
  6. 【Tools】XMind8安装教程详解
  7. 【LeetCode - 42. 接雨水】
  8. 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
  9. 算法笔记--带权并查集及其模板题。
  10. 177. Python语言 的 Flask框架项目 之 发布房源 模块的开发
  11. IP子网划分概念:IP地址,子网和网关配置——Vecloud
  12. TXT文件批量生成二维码
  13. Strawberry Wallpaper:海量5K高清大图壁纸下载工具
  14. 通过京东商品ID获取京东商品评论数据,京东商品评论API接口,接口说明接入方案
  15. 随机生成11位的电话号码
  16. android修改checkbox样式边框颜色
  17. 在职场如何应对他人的关注
  18. Motion Based Multi-Sensor Extrinsic Calibration源码配置与学习记录
  19. 太空帝国5 Space Empires V SE5 攻略
  20. 新手入门:websocket

热门文章

  1. 最小树形图(朱刘算法)
  2. Mysql数据库主从及主主复制配置演示
  3. [English20091217]英语口语444句
  4. ctime库函数的使用
  5. es2017 提供的针对字符串填充的函数:padStart、padEnd
  6. 新加坡计划通过区块链促进东盟金融包容性
  7. 以supervisord启动elasticsearch
  8. iOS开发UINavigation系列四——导航控制器UINavigationController
  9. windows 下使用 Filezilla server 搭建 ftp 服务器
  10. eigrp 重分布默认路由