#线性基,点分治#洛谷 3292 [SCOI2016]幸运数字
分析
题目就是将\(x\)到\(y\)路径上的线性基合并求解,
这里用的是点分治,每次换根到重心的时候维护前缀线性基,
查询的时候如果属于不同的子树就能询问答案,记得\(x=y\)要特判
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
typedef long long lll; const int N=20011,M=200011;
struct node{int y,next;}e[N<<1],E[M<<1];
int n,siz[N],big[N],as[N],SIZ,et=1,Et=1,tot,Q;
int v[N],root,b[N],is_ed[M],hs[N],st[N]; long long a[N],ans[M];
inline lll iut(){
rr lll ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(lll ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
struct Vector_Space{
lll re[61];
inline void BUILD(){
memset(re,0,sizeof(re));
}
inline void Insert(lll x){
for (rr int i=60;~i;--i)
if ((x>>i)&1){
if (!re[i]) {re[i]=x; return;}
x^=re[i];
}
}
inline lll query(lll x){
for (rr int i=60;~i;--i)
if ((x^re[i])>x) x^=re[i];
return x;
}
}H[N];
inline Vector_Space comb(Vector_Space A,Vector_Space B){
rr Vector_Space C; C=A;
for (rr int i=60;~i;--i) C.Insert(B.re[i]);
return C;
}
inline signed max(int a,int b){return a>b?a:b;}
inline void dfs(int x,int fa){
siz[x]=1,big[x]=0;
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa&&!v[e[i].y]){
dfs(e[i].y,x);
siz[x]+=siz[e[i].y];
big[x]=max(big[x],siz[e[i].y]);
}
big[x]=max(big[x],SIZ-siz[x]);
if (big[x]<big[root]) root=x;
}
inline void Get(int x,int fa,int bel){
st[++tot]=x,b[x]=bel,H[x]=H[fa],H[x].Insert(a[x]);
for (rr int i=as[x];i;i=e[i].next)
if (!v[e[i].y]&&e[i].y!=fa) Get(e[i].y,x,bel);
}
inline void calc(int x){
st[tot=1]=b[x]=x,H[x].BUILD(),H[x].Insert(a[x]);
for (rr int i=as[x];i;i=e[i].next)
if (!v[e[i].y]) Get(e[i].y,x,e[i].y);
for (rr int i=1;i<=tot;++i)
for (rr int j=hs[st[i]];j;j=E[j].next)
if (!is_ed[j>>1]&&(b[st[i]]^b[E[j].y]))
is_ed[j>>1]=1,ans[j>>1]=comb(H[st[i]],H[E[j].y]).query(0);
}
inline void dp(int x){
v[x]=1,calc(x);
for (rr int i=as[x];i;i=e[i].next)
if (!v[e[i].y]){
big[0]=SIZ=siz[e[i].y];
dfs(e[i].y,root=0),dp(root);
}
}
signed main(){
n=iut(),Q=iut();
for (rr int i=1;i<=n;++i) a[i]=iut();
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
for (rr int i=1;i<=Q;++i){
rr int x=iut(),y=iut();
if (x==y) ans[i]=a[x],is_ed[i]=1;
E[++Et]=(node){y,hs[x]},hs[x]=Et;
E[++Et]=(node){x,hs[y]},hs[y]=Et;
}
big[0]=SIZ=n,dfs(1,root=0),dp(root);
for (rr int i=1;i<=Q;++i)
print(ans[i]),putchar(10);
return 0;
}
#线性基,点分治#洛谷 3292 [SCOI2016]幸运数字的更多相关文章
- 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增
P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...
- [洛谷P3292] [SCOI2016]幸运数字
洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...
- 洛谷P3292 [SCOI2016] 幸运数字 [线性基,倍增]
题目传送门 幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的 ...
- 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)
传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 第一眼:这不会是个倍增LCA暴力合并线性基吧…… 打了一发……A了? 所以这真的是个暴力倍增LCA合并线性基么…… ps:据某大佬说其实可以离线之后 ...
- Luogu 3292 [SCOI2016]幸运数字
BZOJ 4568. 感觉很板. 前置技能:线性基. 放一篇感觉讲的比较丰富的博客: 戳这里. 首先要求在一个序列中任意选点使得异或和最大,当然是想到线性基了. 把问题转换到树上,如果每次询 ...
- [洛谷P2567] SCOI2010 幸运数字
问题描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是&quo ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- [SCOI2016]幸运数字 树链剖分,线性基
[SCOI2016]幸运数字 LG传送门 为了快乐,我们用树剖写这题. 强行树剖,线段树上每个结点维护一个线性基,每次查询暴力合并. 瞎分析一波复杂度:树剖两点之间\(\log n\)条重链,每条重链 ...
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...
随机推荐
- 糟糕,CPU100%了!!!
前言 cpu使用率100%问题,是一个让人非常头疼的问题.因为出现这类问题的原因千奇百怪,最关键的是它不是必现的,有可能是系统运行了一段时间之后,在突然的某个时间点出现问题. 今天特地把我和同事,之前 ...
- 记录一个错误:Traceback (most recent call last): from pip._internal.cli.main import main ImportError: No module named pip._internal.cli.main
问题描述 在安装yaml时得到报错如下 root@ag-virtual-machine:/home/ag/test_script# pip install pyyaml Traceback (most ...
- ubantu18.04使用APT安装go环境指令报错解决方案
在ubantu下使用sudo apt install golang-go指令安装go环境,安装过程没有报错,在使用时无法识别指令,报错如下: root@sh001:~# go env -w GOPRO ...
- 【Azure Function】Azure Function中使用 Java 8 的安全性问题
问题描述 使用Azure Function, 环境是Linux的Java8.目前 Oracle Java JDK8,11,17 和 OpenJDK 8/11/17 都在存在漏洞受影响版本的范围内. O ...
- 超低功耗mcu芯片AMA3B 开发备忘之初串口打印
一 前言 对于软件工程师来说,没什么比看到一个hello world的打印更让人感觉兴奋了.调试芯片,很多人都知道,hello world这个打印意味着什么. 二 软硬件准备 1 一个AM ...
- 【atcoder 293 F - Erase Subarrays】【动态规划】
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...
- PXE批量安装操作系统自动化
PXEz自动化 在PXE服务器操作: *yum -y install dhcp xinetd tftp tftp-server* *yum -y install system-config-kicks ...
- linux介绍、安装、shell
1-Linux发展介绍 零 什么是Linux Linux:和我们常见的Windows一样,都是操作系统,但不同的是: Windows: 收费,不开源,主要用于日常办公.游戏.娱乐多一些. Linux: ...
- CSS(精灵图、字体图标、三角、用户界面样式、vertical-align、溢出省略号、常用布局技巧、初始化 )
一. 精灵图(重点) 1.1 为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送请求图片,造成服务器请求压力过大,这将大大降低页面的加载速 ...
- iis管理器界面打不开
iis管理器界面打不开 图形界面打不开 服务正常运行 开始->运行->输入以下重置下 inetmgr.exe /reset