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. 并行编程(1) - sum.msic.Unsafe 一

    相信看过java源代码的同学.对 sum.msic.Unsafe 这个类并不陌生,特别是在java.util.concurrent包有非常多的使用. sum.msic.Unsafe源代码:      ...

  2. [Erlang危机](4.2)Remsh

    原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface 联系邮箱:cto@188.com Remsh There's a mechan ...

  3. angularjs1--动画

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  4. webrtc所有平台下载编译步骤详细说明

    webrtc所有平台下载编译步骤详细说明 1.安装depot tools Windows:国外下载:https://storage.googleapis.com/chrome-infra/depot_ ...

  5. webservice为什么不能用List参数,而只能用数组代替,我想是否因为List没有具体的类型信息,但用泛型的List(如:List<customer>)为什么也不行。如果用作参数的类中含有List<T>字段该如何处理?webservice参数是否支持

    转自:https://social.microsoft.com/Forums/zh-CN/aded4301-b5f1-4aa6-aa46-16c46a60d05e/webservice20026201 ...

  6. Spark Streaming概念学习系列之Spark Streaming的竞争对手

    不多说,直接上干货! Spark Streaming的竞争对手 Storm 在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology).这个拓扑将会被提交给集群,由集群中的 ...

  7. 关于SqlBulkCopy的测试

    最近要做.net关于sql大量插入,找到了sqlbulkcopy(自己google下,应该很多说明了)这个好东西,于是测试下性能,用了三个方法对比: 1)直接用ado.net,for循环N次进行单条插 ...

  8. 浅谈SpringCloud (二) Eureka服务发现组件

    上面学习到了如何由一个程序访问另一个程序,那么如果使用SpringCloud来进行访问,该如何访问呐? 可以借助Eureka服务发现组件进行访问. 可以借助官方文档:https://spring.io ...

  9. Android ImageView 替换图片

    网上找了半天,找到的都是错的,都不是我想要的效果.我想要的是点击一个图片后,图片被替换. 通过一下方法可以实现:“v”是ImageView对象,“image_name”是替换后的图片资源 ((Imag ...

  10. How an Event Enters a Cocoa Application

    How an Event Enters a Cocoa Application An event is a low-level record of a user action that is usua ...