bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
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+线性基)的更多相关文章
- [BZOJ4568][Scoi2016]幸运数字 倍增+线性基
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1791 Solved: 685[Submit][Statu ...
- 【BZOJ4568】幸运数字(线性基,树链剖分,ST表)
[BZOJ4568]幸运数字(线性基,树链剖分,ST表) 题面 BZOJ Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市 ...
- 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基
[BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...
- [SCOI2016]幸运数字(线性基,倍增)
[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作 ...
- 【BZOJ 4568】 4568: [Scoi2016]幸运数字 (线性基+树链剖分+线段树)
4568: [Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形 ...
- BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)
传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ...
- [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2131 Solved: 865[Submit][Statu ...
- 【线性基合并 树链剖分】bzoj4568: [Scoi2016]幸运数字
板子题 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市 ...
- 【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)
Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...
随机推荐
- 每一个程序猿都须要了解的一个SQL技巧
对于数据过滤而言CHECK约束已经算是相当不错了.然而它仍存在一些缺陷,比方说它们是应用到表上面的,但有的时候你可能希望指定一条约束,而它仅仅在特定条件下才生效. 使用SQL标准的WITH CHECK ...
- SecureCRT学习之道:SecureCRT 经常使用技巧
快捷键: 1. ctrl + a : 移动光标到行首 2. ctrl + e :移动光标到行尾 3. ctrl + d :删除光标之后的一个字符 4. ctrl + w : 删除行首到当前光标所在位 ...
- 数论TIPS(Loading...)
1.一个数的约数和=(1+p1+p12+...+p1c1)*(1+p2+p22+...+p2c2)*...*(1+pk+pk2+...+pkck)(p为这个数的各个质因数,c表示为各个质因数的次方,k ...
- 【IOI 2011】Race
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2599 [算法] 点分治 [代码] #include<bits/stdc++.h ...
- JavaScript-Tool:md5.js
ylbtech-JavaScript-Tool:md5.js 1.返回顶部 1.md5.js /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 20 ...
- thinkPHP5 报错session_start(): No session id returned by function解决方法
这是因为用Redis接管了session状态储存,但是Redis又连接不正常导致的 在服务器上查看Redis运行状态一切正常,set.get也没有问题,最后琢磨了半天才发现是PHPRedis扩展没有安 ...
- 1.matlab基础准备及入门
1.1 Command Window(命令行窗口)运用入门 1 计算器的用法 2 数值变量与表达式 3. 计算结果的图形表示 代码及注释 function [ output_args ] = Unti ...
- 淘宝druid报错:javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidDataSourceStat
问题: 启动tomcat报错: Tomat报出一下异常:ERROR [com.alibaba.druid.stat.DruidDataSourceStatManager] – unregister m ...
- SQL*PLUS命令的使用大全
Oracle的sql*plus是与oracle进行交互的客户端工具.在sql*plus中,可以运行sql*plus命令与sql*plus语句. 我们通常所说的DML.DDL.DCL语句都是sql*pl ...
- Oprofile分析(android oprofile性能分析)
一.内核支持: make menuconfig 1.评测菜单中启用 Oprofile ,在 .config 文件中设置?CONFIG_PROFILING=y?和?CONFIG_OPROFILE=y 2 ...