4568: [Scoi2016]幸运数字

题目:传送门


题解:

   好题!!!

   之前就看过,当时说是要用线性基...就没学

   填坑填坑:

   %%%线性基 && 神犇

   主要还是对于线性基的运用和LCA的灵活运用吧:

   设f[i][j][65]表示i到2^j-1的线性基集合

   跑LCA,边跑边暴力合并路径上的线性基咯,最后find_max一下xor的最大值就好啦

   槽点:注意^符号的优先级还有空间大小...有点恶心


代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
void add(LL *a,LL x)
{
for(int i=;i>=;i--)
{
if(x&(1LL<<i))
{
if(!a[i]){a[i]=x;break;}
x^=a[i];
}
}
}
void merge(LL *a,LL *b)
{
for(int i=;i<=;i++)
if(b[i])add(a,b[i]);
}
LL ans[],bin[],f[][][],dep[],fa[][];
void pre_tree_node(int x)
{
for(int i=;bin[i]<=dep[x];i++)
{
fa[x][i]=fa[fa[x][i-]][i-];
memcpy(f[x][i],f[x][i-],sizeof(f[x][i]));
merge(f[x][i],f[fa[x][i-]][i-]);
}
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=fa[x][])
{
fa[y][]=x;
dep[y]=dep[x]+;
pre_tree_node(y);
}
}
}
void solve(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
if(dep[fa[x][i]]>=dep[y])
merge(ans,f[x][i]),x=fa[x][i];
if(x==y){merge(ans,f[x][]);return ;}
for(int i=;i>=;i--)
if(bin[i]<=dep[x] && fa[x][i]!=fa[y][i])
{
merge(ans,f[x][i]),merge(ans,f[y][i]);
x=fa[x][i],y=fa[y][i];
}
merge(ans,f[x][]),merge(ans,f[y][]);
merge(ans,f[fa[x][]][]);
return ;
}
LL find_max()
{
LL sum=;
for(int i=;i>=;i--)
if((sum^ans[i])>sum)
sum^=ans[i];
return sum;
}
int n,T;
int main()
{
scanf("%d%d",&n,&T);
bin[]=1LL;for(int i=;i<=;i++)bin[i]=bin[i-]<<;
len=;memset(last,,sizeof(last));
for(int i=;i<=n;i++)
{
LL x;scanf("%lld",&x);
add(f[i][],x);
}
for(int i=;i<n;i++)
{
int x,y;scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
}
fa[][]=;dep[]=;pre_tree_node();
while(T--)
{
int x,y;scanf("%d%d",&x,&y);
memset(ans,,sizeof(ans));
solve(x,y);
printf("%lld\n",find_max());
}
return ;
}

bzoj4568: [Scoi2016]幸运数字(LCA+线性基)的更多相关文章

  1. [BZOJ4568][Scoi2016]幸运数字 倍增+线性基

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1791  Solved: 685[Submit][Statu ...

  2. 【BZOJ4568】幸运数字(线性基,树链剖分,ST表)

    [BZOJ4568]幸运数字(线性基,树链剖分,ST表) 题面 BZOJ Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市 ...

  3. 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基

    [BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...

  4. [SCOI2016]幸运数字(线性基,倍增)

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

  5. 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)

    4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...

  6. BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)

    传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ...

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

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

  8. 【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字

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

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

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

随机推荐

  1. python中类的定义、实例化、封装以及私有变量/方法

    1.  定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...

  2. java实现sql批量插入参数

    背景: 需要更新一些不规范的时间格式,如将某个时间格式化为yy-MM-dd,实际上为 yy-MM-dd hh:mm:ss,并且需要提供回滚脚本. 例如:规范化时间的脚本如下: ,) WHERE tes ...

  3. spring事务,TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    在aop配置事务控制或注解式控制事务中,try...catch...会使事务失效,可在catch中抛出运行时异常throw new RuntimeException(e)或者手动回滚Transacti ...

  4. 取消overflow-scroll的滚动条

    通常情况下设置完overflow:scroll之后,就会在页面中出现滚动条,下边的方法可以取消掉此滚动条: container为当前设置overflow:scroll的元素 1.使用以下CSS可以隐藏 ...

  5. 微信小程序遇坑笔记

    最近做了一个简单的微信小程序,遇到了一些坑: 1.appid固定,但是appsecret是可以变的,而且没有地方查看,后台以查看就是变更了,所以这个地方在开发的时候需要保存好: 2.打开网页,这个网页 ...

  6. Spring meven 配置

    使用maven的仓库化管理,可以更方便有效的控制文件. 在官网下载maven. 官网的地址:http://maven.apache.org/download.cgi  请选择最新的版本下载, 这里我用 ...

  7. ajax返回值

    前端: <html> <head> <meta name="viewport" content="width=device-width&qu ...

  8. UVa 11520 Fill in the Square

    题意:给出 n*n的格子,把剩下的格子填上大写字母,使得任意两个相邻的格子的字母不同,且从上到下,从左到右的字典序最小 从A到Z枚举每个格子填哪一个字母,再判断是否合法 #include<ios ...

  9. 更博不能忘——webpack学习笔记

    webpack是前端构建系统就像grunt和gulp(之前有学习过grunt所以也就大概明白webpack是个什么东西),所以说前端技术大部分还真是相通的,现在觉得当时多看的东西并不白费,虽然长时间不 ...

  10. Chrome添加Unity本地文档引擎

    前提:输入Unity后出来的第一连接 浏览器的设置: 分别填入: UnityDocs unity3d.com/cn file:///Applications/Unity/Documentation/e ...