「SCOI2016」幸运数字

思路:

  线性基;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 20005
#define ll long long
struct DataType {
ll d[],p[];
ll cnt;
DataType()
{
memset(d,,sizeof(d));
memset(p,,sizeof(p));
cnt=;
}
bool insert(long long val)
{
for(ll i=;i>=;i--)
{
if(val&(1LL<<i))
{
if(!d[i])
{
d[i]=val;
break;
}
val^=d[i];
}
}
return val>;
}
ll Max()
{
ll res=;
for(ll i=;i>=;i--)
{
if((res^d[i])>res) res^=d[i];
}
return res;
}
};
struct DataType ans;
struct TreeNodeType {
ll l,r,mid;
DataType data;
};
struct TreeNodeType tree[maxn<<];
ll n,m,deep[maxn],id[maxn],size[maxn],f[maxn],head[maxn];
ll E[maxn<<],V[maxn<<],tot,ai[maxn],bi[maxn],lar[maxn];
ll top[maxn];
inline void in(ll &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'')Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
void edge_add(ll u,ll v)
{
E[++tot]=head[u],V[tot]=v,head[u]=tot;
E[++tot]=head[v],V[tot]=u,head[v]=tot;
}
void merge(DataType &a,DataType b)
{
for(ll i=;i<=;i++)
{
if(b.d[i]) a.insert(b.d[i]);
}
}
void dfs1(ll now,ll fa)
{
f[now]=fa,deep[now]=deep[fa]+,size[now]=;
for(ll i=head[now];i;i=E[i])
{
if(V[i]==fa) continue;
dfs1(V[i],now),size[now]+=size[V[i]];
if(size[lar[now]]<size[V[i]]) lar[now]=V[i];
}
}
void dfs2(ll now,ll chain)
{
top[now]=chain,id[now]=++tot,bi[tot]=ai[now];
if(lar[now])
{
dfs2(lar[now],chain);
for(ll i=head[now];i;i=E[i])
{
if(V[i]==lar[now]||V[i]==f[now]) continue;
dfs2(V[i],V[i]);
}
}
}
void build(ll now,ll l,ll r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
tree[now].data.insert(bi[l]);
return;
}
tree[now].mid=l+r>>;
build(now<<,l,tree[now].mid),build(now<<|,tree[now].mid+,r);
tree[now].data=tree[now<<].data;
merge(tree[now].data,tree[now<<|].data);
}
void query(ll now,ll l,ll r)
{
if(tree[now].l>=l&&tree[now].r<=r)
{
merge(ans,tree[now].data);
return;
}
if(l<=tree[now].mid) query(now<<,l,r);
if(r>tree[now].mid) query(now<<|,l,r);
}
ll query(ll x,ll y)
{
for(int i=;i<=;i++) ans.d[i]=,ans.p[i]=;
ans.cnt=;
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) query(,id[top[y]],id[y]),y=f[top[y]];
else query(,id[top[x]],id[x]),x=f[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);
query(,id[x],id[y]);
return ans.Max();
}
int main()
{
freopen("data.txt","r",stdin);
in(n),in(m);ll u,v;
for(ll i=;i<=n;i++) in(ai[i]);
for(ll i=;i<n;i++)in(u),in(v),edge_add(u,v);
dfs1(,),tot=,dfs2(,),build(,,n);
while(m--) in(u),in(v),printf("%lld\n",query(u,v));
return ;
}

AC日记——「SCOI2016」幸运数字 LiBreOJ 2013的更多相关文章

  1. AC日记——「SCOI2016」背单词 LiBreOJ 2012

    #2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  2. loj#2013. 「SCOI2016」幸运数字 点分治/线性基

    题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...

  3. loj #2013. 「SCOI2016」幸运数字

    #2013. 「SCOI2016」幸运数字 题目描述 A 国共有 n nn 座城市,这些城市由 n−1 n - 1n−1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以 ...

  4. AC日记——「SCOI2016」美味 LiBreOJ 2016

    #2016. 「SCOI2016」美味 思路: 主席树: 代码: #include <bits/stdc++.h> using namespace std; #define maxa 26 ...

  5. AC日记——「HNOI2017」单旋 LiBreOJ 2018

    #2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  6. AC日记——「SCOI2015」国旗计划 LiBreOJ 2007

    #2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define ma ...

  7. AC日记——「SDOI2017」序列计数 LibreOJ 2002

    「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...

  8. 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】

    [bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...

  9. LOJ #2013「SCOI2016」幸运数字

    时限为什么这么大啊 明摆着放多$ log$的做法过啊$QAQ$ LOJ #2013 题意 有$ Q$次询问,每次询问树上一条链,点有点权,你需要选择一些链上的点使得异或和尽量大 点数$ \leq 2* ...

随机推荐

  1. Java Web用Freemarker生成带图片的Word文档

    步骤一:模板制作 用world2003做一个导出模板,如果有图片则加入一张图片占位,将world另存为xml,将xml中需要导出的内容用Freemarker标签表示,最后另存为.ftl结尾的模板: 步 ...

  2. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题解

    Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题目链接:https://codeforces.com/contest/1130 ...

  3. ContentProvider学习

    1.创建类继承ContentProvider类,并实现增.删.改.查功能. public static final String AUTHORITY = "com.diysoul.lists ...

  4. 【updating】python读书笔记-The Django Book2.0(for django1.4)

    原文:http://www.djangobook.com/en/2.0/frontmatter.html 译文:http://djangobook.py3k.cn/2.0/ 或者http://docs ...

  5. C#泛型实例详解

    本文以实例形式讲述了C#泛型的用法,有助于读者深入理解C#泛型的原理,具体分析如下: 首先需要明白什么时候使用泛型: 当针对不同的数据类型,采用相似的逻辑算法,为了避免重复,可以考虑使用泛型. 一.针 ...

  6. 2017 济南综合班 Day 6

    循环移动 (cyclic.cpp/c/pas) (1s/256M) 问题描述 给出一个字符串S与N个操作.每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K ...

  7. 【C++对象模型】第六章 执行期语意学

    执行期语意学,即在程序执行时,编译器产生额外的指令调用,确保对象的构造,内存的释放,以及类型转换与临时对象的生成的安全进行. 1.对象的构造和析构 对于类对象的构造,一般在定义之后则开始内部的构造过程 ...

  8. [Luogu 3178] HAOI2013 树上操作

    [Luogu 3178] HAOI2013 树上操作 一道比模板还简单的难以置信的裸HLD省选题. 大约是需要long long. #include <cstdio> #include & ...

  9. Linux下Tomcat重启脚本

    我们重启Tomcat服务的时候,Tomcat自带的shutdown.sh脚本有时并不能真正杀死进程,经常需要我们用“kill -9 pid”的方式来杀死进程. 下面的脚本可以简化我们的操作,执行可杀死 ...

  10. uoj308 【UNR #2】UOJ拯救计划

    传送门:http://uoj.ac/problem/308 [题解] 考虑枚举用了$i$所学校,那么贡献为${k \choose i} * cnt * i!$ 意思是从$k$所选$i$所出来染色,$c ...