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. 0x07 贪心

    被虐爆了...贪心这种玄学东西还可以证吗??除了范围缩放算是可以想想比较经典(倍增第一题?)... poj3614:这道题想了很久,并没有想到是把minSPF按大到小排序,一直的思想是小的就小到大排序 ...

  2. BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

    BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...

  3. $scope angular在controller之外调用

    1.定义 var m = angular.module('ddd',[]); m.controller('ctrl',['$scope',function ($scope) { }]); 2.外部调用 ...

  4. 英语发音规则---K字母

    英语发音规则---K字母 一.总结 一句话总结: 1.K发[k]音? kind [kaɪnd] n. 种类 bike [baɪk] n. 自行车 skate [skeɪt] vi. 滑冰 make [ ...

  5. 2016 提高组c++ 错题

    需重做 树的重心 链表 计算机基础知识 无线通讯技术: 蓝牙,wifi,GPRS 现在常用的无线通信技术:FM调频广播(用于收音机): 2G.3G移动通信技术(中国移动.中国联通.中国电信正在运营的网 ...

  6. C#对 Json的序列化和反序列化时出现“k_BackingField”

    在C#2.0的项目中,以前经常使用Json.NET实现序列化和反序列化.后来从c#3.0中开始使用新增的DataContractJsonSerializer进行json相关的操作.微软提供的原生类库使 ...

  7. DIV水平方向居中的几种方法

    一.使用margin: 1 #center0 { 2 background: red; 3 margin: 0 auto; 4 } 或者: margin: auto; 这样的前提是父盒子里没有其他盒子 ...

  8. 陆、jq基础语法

    一.概述:更加方便的处理html文档.events事件.动画效果和ajax交互等. 1.jq主要功能: (1)访问页面框架的局部. (2)修改页面表现 (3)更改页面的内容 (4)响应事件 (5)为页 ...

  9. kvm三个kernel相关的调优

    今天在杭州参加淘宝嘉年华技术沙龙,主题是虚拟化和云计算,三个讲演: 淘宝网子团分享淘宝kvm技术的使用 华为的杨晓伟介绍虚拟化技术 阿里云郑永升介绍弹性云计算技术 其中KVM 调优,三点值得关注的: ...

  10. HDU 1205 吃糖果(水题)

    链接:传送门 思路:思维僵硬了,僵硬...... 简单的插隔板思想......选出来数量最多的糖果种类X,假设X数量为MAX,然后以X作为"隔板",形成X _ X _ X _ X ...