luogu3292 幸运数字 (点分治+线性基)
首先第一眼是一个倍增套线性基,但是$O(Qlog^2Vlog^N)=10^{10}$的复杂度...
即使是st表也只是变成了$O(Nlog^2Vlog^N)$啊
考虑点分治,相对于倍增显著减少了线性基合并(一个往另一个里暴力插)这一O(log^2V)的过程
就是在分治到一个询问的两端点分立于两个子树的时候,合并它们的线性基来统计答案
#include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=2e4+,maxq=2e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int b,i;
};
int N,Q,siz[maxn];
vector<Node> q[maxn];
int eg[maxn*][],egh[maxn],ect;
bool flag[maxn];
ll base[maxn][],tmp[],val[maxn],ans[maxq];
int son[maxn],sct,bel[maxn]; inline void adeg(int a,int b){
eg[++ect][]=b,eg[ect][]=egh[a],egh[a]=ect;
}
inline void getroot(int x,int f,int ssiz,int &rt,int &sm){
siz[x]=;int m=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f||flag[b]) continue;
getroot(b,x,ssiz,rt,sm);
m=max(siz[b],m);siz[x]+=siz[b];
}m=max(ssiz-siz[x],m);
if(m<sm) rt=x,sm=m;
} inline void update(ll *bs,ll v){
for(int i=;i>=;i--){
if(v&(1ll<<i)){
if(!bs[i]){bs[i]=v;break;}
else v^=bs[i];
}
}
} inline ll query(ll *bs,ll v){
for(int i=;i>=;i--){
if((v^bs[i])>v) v^=bs[i];
}return v;
} inline void getbase(int x,int f){
update(base[x],val[x]);
son[++sct]=x;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f||flag[b]) continue;
memcpy(base[b],base[x],sizeof(base[x]));
getbase(b,x);
}
} inline void solve(int x,int ssiz){
flag[x]=;bel[x]=x;CLR(base[x],);
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(flag[b]) continue;
CLR(base[b],);sct=;
getbase(b,);
for(int i=;i<=sct;i++){
int y=son[i];
for(int j=;j<q[y].size();j++){
int b=q[y][j].b;
if(bel[b]!=x) continue;
memcpy(tmp,base[y],sizeof(tmp));
for(int k=;k<=;k++){
if(base[b][k]) update(tmp,base[b][k]);
}
ans[q[y][j].i]=max(query(tmp,),query(tmp,val[x]));
}
}
for(int i=;i<=sct;i++) bel[son[i]]=x;
}
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(flag[b]) continue;
int rt,sm=1e9;
getroot(b,,siz[b]>siz[x]?ssiz-siz[x]:siz[b],rt,sm);
solve(rt,siz[b]>siz[x]?ssiz-siz[x]:siz[b]);
}
} int main(){
int i,j,k;
N=rd(),Q=rd();
for(i=;i<=N;i++) val[i]=rd();
for(i=;i<N;i++){
int a=rd(),b=rd();
adeg(a,b);adeg(b,a);
}
for(i=;i<=Q;i++){
int a=rd(),b=rd();
if(a==b) ans[i]=val[a];
else{
q[a].push_back((Node){b,i});
q[b].push_back((Node){a,i});
} }
int rt,sm=1e9;
getroot(,,N,rt,sm);
solve(rt,N);
for(i=;i<=Q;i++)
printf("%lld\n",ans[i]);
return ;
}
luogu3292 幸运数字 (点分治+线性基)的更多相关文章
- loj#2013. 「SCOI2016」幸运数字 点分治/线性基
题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...
- 2019.03.25 bzoj4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 题意:给你一棵带点权的树,多次询问路径的最大异或和. 思路: 线性基上树?? 倍增维护一下就完了. 时间复杂度O(nlog3n)O(nlog^3n)O(nlog3n) 代码: #include ...
- 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)
传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 第一眼:这不会是个倍增LCA暴力合并线性基吧…… 打了一发……A了? 所以这真的是个暴力倍增LCA合并线性基么…… ps:据某大佬说其实可以离线之后 ...
- SCOI2016幸运数字(树剖/倍增/点分治+线性基)
题目链接 loj luogu 题意 求树上路径最大点权异或和 自然想到(维护树上路径)+ (维护最大异或和) 那么有三种方法可以选择 1.树剖+线性基 2.倍增+线性基 3.点分治+线性基 至于线性基 ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基
正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- BZOJ4568 [Scoi2016]幸运数字 【点分治 + 线性基】
题目链接 BZOJ4568 题解 选任意个数异或和最大,使用线性基 线性基插入\(O(logn)\),合并\(O(log^2n)\) 我们要求树上两点间异或和最大值,由于合并是\(O(log^2n)\ ...
- 【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基
4184: shallot Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 356 Solved: 180[Submit][Status][Discu ...
随机推荐
- Azure系列2.1.14 —— CopyState
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...
- [转帖]Windows平台卸载Oracle的办法
1.首先打开服务:选中此电脑->点击右键->选择管理->选择服务和应用程序->服务 在右边查看并停止以 oracle开头的服务(选中正在运行的以oracle开头的服务-> ...
- restful 规范(建议)
需求:开发cmdb,对用户进行管理. 做前后端分离,后端写api(URL),对用户表进行增删改查,应该写四个URL(还要给文档(返回值,返回,请求成功,干嘛,失败,干嘛)),然后分别写视图函数. ht ...
- systemd取消对服务重启的限制
默认情况下,一个服务在10秒内最多允许启动5次.当超过5次后,会报如下错误: Job for xx.service failed because start of the service was at ...
- NFS配置与搭建
参考: Linux下NFS服务器的搭建与配置 https://www.cnblogs.com/liuyisai/p/5992511.html http://blog.51cto.com/hongten ...
- X5中CSS设置
颜色渐变 position:absolute;left:0;top:40%; 效果图 点击导航按钮变化颜色 1.设置按钮class为 btn-link(超链接) 2.为每一个导航按钮增加属性id 3. ...
- AVL树,红黑树
AVL树 https://baike.baidu.com/item/AVL%E6%A0%91/10986648 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高 ...
- thymeleaf 简易使用范例
thymeleaf 范例: <!DOCTYPE html> <html lang="en" xmlns:th="http://www.w3.org/19 ...
- vue中组件绑定事件时是否加.native
组件绑定事件时 1. 普通组件绑定事件不能添加.native, 添加后事件失效 2. 自定义组件绑定事件需要添加.native, 否则事件无效 <template> <!-- < ...
- js函数使用prototype和不适用prototype的区别
js中类定义函数时用prototype与不用的区别 原创 2017年06月05日 12:25:41 标签: 函数 / prototype / class 首先来看一个实例: function Li ...