【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基
【BZOJ4568】[Scoi2016]幸运数字
Description
Input
Output
输出需要包含 q 行,每行包含 1 个非负整数,表示这名旅行者可以保留的最大幸运值。
Sample Input
11 5 7 9
1 2
1 3
1 4
2 3
1 4
Sample Output
11
题解:求LCA可以用倍增,同时,我们还可以维护f[i][j]表示从i往上的2j个点中,所有权值的线性基。然后查询的时候我们把路径上的线性基都拿出来一起消一下,贪心求最大值就行了。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=20005;
typedef long long ll;
int n,m,cnt;
int fa[15][maxn],dep[maxn],to[maxn<<1],next[maxn<<1],head[maxn];
struct node
{
int siz;
ll v[61];
node (){memset(v,0,sizeof(v)),siz=0;}
ll gauss(ll x)
{
int i;
for(i=0;i<siz;i++) if((v[i]^x)<x) x^=v[i];
if(x)
{
v[siz++]=x;
for(i=siz-1;i;i--) if(v[i-1]<v[i]) swap(v[i-1],v[i]);
}
return x;
}
ll query()
{
ll ret=0;
for(int i=0;i<siz;i++) if((ret^v[i])>ret) ret^=v[i];
return ret;
}
}s[15][maxn];
ll rd()
{
ll ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
for(int i=head[x];i!=-1;i=next[i])
if(to[i]!=fa[0][x])
fa[0][to[i]]=x,dep[to[i]]=dep[x]+1,dfs(to[i]);
}
int main()
{
//freopen("bz4568.in","r",stdin);
n=rd(),m=rd();
int i,j,k,a,b;
for(i=1;i<=n;i++) s[0][i].gauss(rd());
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
dep[1]=1,dfs(1);
for(j=1;(1<<j)<=n;j++)
{
for(i=1;i<=n;i++)
{
for(k=0;k<s[j-1][i].siz;k++) s[j][i].gauss(s[j-1][i].v[k]);
for(k=0;k<s[j-1][fa[j-1][i]].siz;k++) s[j][i].gauss(s[j-1][fa[j-1][i]].v[k]);
fa[j][i]=fa[j-1][fa[j-1][i]];
}
}
for(i=1;i<=m;i++)
{
a=rd(),b=rd();
node ans;
if(dep[a]<dep[b]) swap(a,b);
for(j=14;j>=0;j--)
{
if(dep[fa[j][a]]>=dep[b])
{
for(k=0;k<s[j][a].siz;k++) ans.gauss(s[j][a].v[k]);
a=fa[j][a];
}
}
if(a!=b)
{
for(j=14;j>=0;j--)
{
if(fa[j][a]!=fa[j][b])
{
for(k=0;k<s[j][a].siz;k++) ans.gauss(s[j][a].v[k]);
for(k=0;k<s[j][b].siz;k++) ans.gauss(s[j][b].v[k]);
a=fa[j][a],b=fa[j][b];
}
}
ans.gauss(s[0][a].v[0]),ans.gauss(s[0][b].v[0]),ans.gauss(s[0][fa[0][a]].v[0]);
}
else ans.gauss(s[0][a].v[0]);
printf("%lld\n",ans.query());
}
return 0;
}
【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基的更多相关文章
- [BZOJ4568][Scoi2016]幸运数字 倍增+线性基
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1791 Solved: 685[Submit][Statu ...
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...
- BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ...
- 【BZOJ4568】幸运数字(线性基,树链剖分,ST表)
[BZOJ4568]幸运数字(线性基,树链剖分,ST表) 题面 BZOJ Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市 ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...
- 【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)
Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...
- 2019.03.25 bzoj4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 题意:给你一棵带点权的树,多次询问路径的最大异或和. 思路: 线性基上树?? 倍增维护一下就完了. 时间复杂度O(nlog3n)O(nlog^3n)O(nlog3n) 代码: #include ...
随机推荐
- 动态设置表格[GridView]在编辑时 只读。
找到GridView的CellEditorInitalize事件. protected void agv_main_CellEditorInitialize(object sender, ASPxGr ...
- Xshell 初次应用
以前就想安装Xshell,今天终于弄好了,可以在windows下对Linux服务端进行管理. 关于SSH和Xshell的介绍见参考,Linux上安装的是ssh服务端,所以咱们如果希望通过远程访问的方式 ...
- hibernate 数据缓存
http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html,
- git 添加远程库
1.登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库. 在Repository name填入learngit,其他保持默认设置,点击“Create re ...
- git 安装方法
Windows上安装Git示例 在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可. 安装完成后,在开始菜单里找到“Git”-> ...
- (一)关于jQuery的网上资源
jQuery官网: http://jquery.com/ jQuery API: http://jquery.cuishifeng.cn/ w3school学习网站:http://www.w3scho ...
- Javascript模式(二) 发布者/订阅者模式
var publisher = { // 订阅者数组 subscribers : { "any" : [] }, // 增加订阅者 on : function(type, fn, ...
- linux - console/terminal/virtual console/pseudo terminal ...
http://en.wikipedia.org/wiki/System_console System console Knoppix system console showing the boot p ...
- C++ Singleton + MultiThread
#include <iostream> #include <mutex> using namespace std; template <class T> class ...
- 12306 外包给阿里巴巴、IBM 等大企业做是否可行?
知乎上看到的,转载过来,雅俗共赏 12306首秀被骂的狗血喷头后铁道部找来IBM.阿里巴巴等大企业要解决方式,给出的条件是资金管够可是问题得解决. 几大企业最后都拒绝了(当中阿里巴巴最后负责了排队系统 ...