强行把序列问题放树上,好无聊啊~

code:

#include <bits/stdc++.h>
#define N 200005
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int tot,edges,tim;
int cnt[N*33],ch[N*33][2],tree[N],seq[N],val[N],ba[N];
int fa[N],son[N],size[N],top[N],dep[N],hd[N],to[N<<1],nex[N<<1],dfn[N],ed[N];
inline void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void insert(int pre,int &x,int v)
{
int now=x=++tot;
for(int i=30;i>=0;--i)
{
int o=((v>>i)&1);
ch[now][o^1]=ch[pre][o^1];
ch[now][o]=++tot;
pre=ch[pre][o];
now=tot;
cnt[now]=cnt[pre]+1;
}
}
void dfs1(int u,int ff)
{
fa[u]=ff,dep[u]=dep[ff]+1,size[u]=1,dfn[u]=++tim,ba[tim]=u;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
insert(tree[u],tree[v],val[v]);
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[son[u]]) son[u]=v;
}
ed[u]=tim;
}
void dfs2(int u,int tp)
{
top[u]=tp;
if(son[u]) dfs2(son[u],tp);
for(int i=hd[u];i;i=nex[i]) if(to[i]!=fa[u]&&to[i]!=son[u]) dfs2(to[i],to[i]);
}
inline int LCA(int x,int y)
{
while(top[x]!=top[y]) dep[top[x]]>dep[top[y]]?x=fa[top[x]]:y=fa[top[y]];
return dep[x]<dep[y]?x:y;
}
int query1(int x,int y,int z)
{
int re=0;
for(int i=30;i>=0;--i)
{
int o=((z>>i)&1);
if(cnt[ch[y][o^1]]>cnt[ch[x][o^1]])
{
re+=(1<<i);
y=ch[y][o^1];
x=ch[x][o^1];
}
else
{
y=ch[y][o];
x=ch[x][o];
}
}
return re;
}
int query2(int x,int y,int lca,int ff,int z)
{
int re=0;
for(int i=30;i>=0;--i)
{
int o=((z>>i)&1);
if(cnt[ch[x][o^1]]+cnt[ch[y][o^1]]-cnt[ch[lca][o^1]]-cnt[ch[ff][o^1]])
{
re+=(1<<i);
x=ch[x][o^1];
y=ch[y][o^1];
lca=ch[lca][o^1];
ff=ch[ff][o^1];
}
else
{
x=ch[x][o];
y=ch[y][o];
lca=ch[lca][o];
ff=ch[ff][o];
}
}
return re;
}
int main()
{
// setIO("input");
int i,j,n,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i) scanf("%d",&val[i]);
for(i=1;i<n;++i)
{
int x,y;
scanf("%d%d",&x,&y), add(x,y), add(y,x);
}
insert(tree[0],tree[1],val[1]);
dfs1(1,0);
dfs2(1,1);
for(i=1;i<=tim;++i) insert(seq[i-1],seq[i],val[ba[i]]);
while(m--)
{
int op,x,y,z;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&x,&y);
printf("%d\n",query1(seq[dfn[x]-1],seq[ed[x]],y));
}
else
{
scanf("%d%d%d",&x,&y,&z);
int t=LCA(x,y);
printf("%d\n",query2(tree[x],tree[y],tree[t],tree[fa[t]],z));
}
}
return 0;
}

  

BZOJ 5338: [TJOI2018]xor 可持久化trie+dfs序的更多相关文章

  1. BZOJ.5338.[TJOI2018]xor(可持久化Trie)

    BZOJ LOJ 洛谷 惊了,18年了还有省选出模板题吗= = 做这题就是练模板的,我就知道我忘的差不多了 询问一就用以DFS序为前缀得到的可持久化Trie做,询问二很经典的树上差分. 注意求询问二的 ...

  2. bzoj 5338: [TJOI2018]xor (树链剖分+可持久化01Trie)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5338 题面: 5338: [TJOI2018]xor Time Limit: 30 Sec  ...

  3. [BZOJ5338][TJOI2018]xor(可持久化Trie)

    可持久化Trie模板题. 建两种可持久化Trie,每个点两棵,一棵对DFS求前缀和,一棵对祖先求前缀和. 或者树剖,不好写多少还多个log. #include<cstdio> #inclu ...

  4. HDU 6191 Query on A Tree(可持久化Trie+DFS序)

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  5. BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )

    把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...

  6. BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)

    题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...

  7. BZOJ_5338_ [TJOI2018]xor_可持久化trie

    BZOJ_5338_ [TJOI2018]xor_可持久化trie Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...

  8. bzoj 4546: codechef XRQRS [可持久化Trie]

    4546: codechef XRQRS 可持久化Trie codechef上过了,bzoj上蜜汁re,看别人说要开5.2e5才行. #include <iostream> #includ ...

  9. 【xsy1147】 异或(xor) 可持久化trie

    我的脑回路可能比较奇怪. 我们对这些询问离线,将所得序列${a}$的后缀和建$n$棵可持久化$trie$. 对于一组询问$(l,r,x)$,我们在主席树上询问第$l$棵树$-$第r$+1$棵树中与$s ...

随机推荐

  1. Spark之RDD依赖关系及DAG逻辑视图

    RDD依赖关系为成两种:窄依赖(Narrow Dependency).宽依赖(Shuffle Dependency).窄依赖表示每个父RDD中的Partition最多被子RDD的一个Partition ...

  2. git如何支持doc文档

    这个问题很容易解决,只要添加一个 .gitattributes 内容如下: ////////////////////////////////////////////////////////////// ...

  3. MEF在WCF REST中实际应用2(Global.asax注册)

    IOCContainer文件: public class IOCContainer { /// <summary> /// 容器 /// </summary> public s ...

  4. win10 mars xlog编译

    win10 mars xlog编译   一. 环境准备 安装 cmake 以及 python2.7, 以及下载 ndk-r16b,并配置环境变量 NDK_ROOT 指向 ndk 路径. 如果是 Win ...

  5. springboot自定义消息转换器HttpMessageConverter Spring Boot - 使用Gson替换Jackson

    Jackson一直是springframework默认的json库,从4.1开始,springframework支持通过配置GsonHttpMessageConverter的方式使用Gson. 在典型 ...

  6. 安装R和RStudio详细步骤

    安装这两项都很简单!! 1.首先要下载R安装包,可以去官网下载,也可以直接从我的百度网盘下载. 官网下载步骤: (1)进入网址:https://cran.r-project.org,选择适合自己电脑系 ...

  7. 必须掌握的Linux用户组

    在 Linux 系统中用户组起着重要作用.用户组提供了一种简单方法供一组用户互相共享文件.用户组也允许系统管理员更加有效地管理用户权限,因为管理员可以将权限分配给用户组而不是逐一分配给单个用户. 尽管 ...

  8. 实战FFmpeg + OpenGLES--iOS平台上视频解码和播放

    一个星期的努力终于搞定了视频的播放,利用FFmpeg解码视频,将解码的数据通过OpenGLES渲染播放.搞清楚了自己想知道的和完成了自己的学习计划,有点小兴奋.明天就是“五一”,放假三天,更开心啦. ...

  9. Java开发环境之RabbitMQ

    查看更多Java开发环境配置,请点击<Java开发环境配置大全> 捌章:RabbitMQ安装教程 1)下载安装Erlang 官网下载:http://www.erlang.org,有时比较难 ...

  10. Response响应相关

    response是响应的对象 response.text      # 返回的是字节,数据的原内容response.content # 返回的是字符串,默认是utf-8解码 import reques ...