正题

题目链接:https://www.luogu.com.cn/problem/P3292


题目大意

nnn个点的一棵树,每个点都点权。每次询问一条路径,选择若干个点的异或和最大。


解题思路

路径上的如何进行计算,我们知道我们可以用倍增来计算权值和。我们可以把每个线性基视为边权,然后加和就是线性基的合并。

合并线性基时我们将后面的所有did_idi​都插入到前面那个线性基中即可。

时间复杂度O((n+q)log3n)O((n+q)log^3 n)O((n+q)log3n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=21000,T=15;
struct node{ll to,next;
}a[N*2];
struct xxj{ll d[80];ll solve(){ll ans=0;for(ll i=60;i>=0;i--)if((ans^d[i])>ans)ans^=d[i];return ans;}void add(ll x){if(!x)return;for(ll i=60;i>=0;i--)if((x>>i)&1ll){if(d[i])x^=d[i];else{d[i]=x;return;}}}
}w[N][T];
ll n,q,tot,ls[N],dep[N],g[N],f[N][T];
xxj operator+(const xxj &a,const xxj &b){xxj ans=a;for(ll i=0;i<=60;i++)if(b.d[i])ans.add(b.d[i]);return ans;
}
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dfs(ll x){dep[x]=dep[f[x][0]]+1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==f[x][0])continue;f[y][0]=x;dfs(y);}return;
}
void ycl(){for(ll i=1;i<=n;i++)w[i][0].add(g[i]);for(ll j=1;j<T;j++){for(ll i=1;i<=n;i++){f[i][j]=f[f[i][j-1]][j-1];w[i][j]=w[i][j-1]+w[f[i][j-1]][j-1];}}return;
}
ll LCA(ll x,ll y){xxj ans;memset(ans.d,0,sizeof(ans.d));if(dep[x]>dep[y])swap(x,y);for(ll i=T-1;i>=0;i--)if(dep[f[y][i]]>=dep[x])ans=ans+w[y][i],y=f[y][i];if(x==y){ans.add(g[x]);return ans.solve();}for(ll i=T-1;i>=0;i--)if(f[x][i]!=f[y][i])ans=ans+w[x][i]+w[y][i],x=f[x][i],y=f[y][i];ans=ans+w[x][0]+w[y][0];ans.add(g[f[x][0]]);return ans.solve();
}
int main()
{scanf("%lld%lld",&n,&q);for(ll i=1;i<=n;i++)scanf("%lld",&g[i]);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}dfs(1);ycl();while(q--){ll x,y;scanf("%lld%lld",&x,&y);printf("%lld\n",LCA(x,y));}
}

P3292-[SCOI2016]幸运数字【线性基,LCA,倍增】相关推荐

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

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

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

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

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

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

  4. 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)

    传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 第一眼:这不会是个倍增LCA暴力合并线性基吧-- 打了一发--A了? 所以这真的是个暴力倍增LCA合并线性基么-- ps:据某大佬说其实可以离线之后 ...

  5. Bzoj4568: [Scoi2016]幸运数字

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

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

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

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

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

  8. BZOJ4568 [Scoi2016]幸运数字

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

  9. 【bzoj4568】【SCOI2016】【幸运数字】【树上倍增+线性基】

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

最新文章

  1. 创业者应该如何看待金钱
  2. 2014百度之星 Xor Sum(字典树+贪心)
  3. Java源文件的编译、下载、解释和执行
  4. 如何启用SAP C4C OData Event Notification
  5. excel重复上一步快捷键_13个excel快捷键,让你的1秒钟,抵得上同事的5分钟
  6. Python容器专题 - 列表(list)
  7. Hive总结(十二)Hive查询进阶
  8. 百度贴吧界面html程序代码,如何把自己的网址转换为百度贴吧网址?
  9. C++ primer 5th 读完的一点心得体会
  10. python arduino小车,搭建ROS小车底盘-第六篇ros_arduino_bridge功能包的使用
  11. python绘制国内生产总值散点图_Python学习第90课-数据可视化之散点图绘制
  12. 3.6 OrCAD中元器件应该怎么进行镜像与翻转?
  13. 远程桌面连接如何重启计算机,如何使用“远程桌面连接”连接到另一台计算机...
  14. GHO文件转iso文件能启动安装
  15. 有关针式打印机和一体机的安装
  16. 手机变Android麦克风,【工具】手机秒变摄像头及麦克风方法
  17. 显示 wordpress 文章摘要函数the_excerpt
  18. 学计算机颈椎痛,近九成电脑族曾颈椎疼痛,怎么办?
  19. 咪蒙微信公众号已被注销 酷玩实验室因不实报道道歉
  20. 图像处理过程中为什么有时需要进行归一化处理 ?

热门文章

  1. java字符串拼接例子_Java详解【String】+【StringBuilder vs StringBuffer】+【字符串拼接】...
  2. linux实验目的能学会什么意思,Linux实验.doc
  3. memcached mysql缓存_memcached做数据库缓存
  4. scrcpy投屏_安卓投屏利器——PC一键控制多台手机
  5. 11尺寸长宽 iphone_新手必知LED显示屏尺寸规格及计算方法
  6. mysql 错误 0152_SP2-1503 SP2-0152 错误解决
  7. [RabbitMQ]常用命令
  8. [蓝桥杯2017初赛]等差素数列-巧妙枚举(思维)
  9. 数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树
  10. iso qemu 安装ubuntu_基于libvirt 和QEMU在macOS安装Ubuntu