BZOJ 5338: [TJOI2018]xor 可持久化trie+dfs序
强行把序列问题放树上,好无聊啊~
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序的更多相关文章
- BZOJ.5338.[TJOI2018]xor(可持久化Trie)
BZOJ LOJ 洛谷 惊了,18年了还有省选出模板题吗= = 做这题就是练模板的,我就知道我忘的差不多了 询问一就用以DFS序为前缀得到的可持久化Trie做,询问二很经典的树上差分. 注意求询问二的 ...
- bzoj 5338: [TJOI2018]xor (树链剖分+可持久化01Trie)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5338 题面: 5338: [TJOI2018]xor Time Limit: 30 Sec ...
- [BZOJ5338][TJOI2018]xor(可持久化Trie)
可持久化Trie模板题. 建两种可持久化Trie,每个点两棵,一棵对DFS求前缀和,一棵对祖先求前缀和. 或者树剖,不好写多少还多个log. #include<cstdio> #inclu ...
- 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 ...
- BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )
把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...
- BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)
题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...
- BZOJ_5338_ [TJOI2018]xor_可持久化trie
BZOJ_5338_ [TJOI2018]xor_可持久化trie Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...
- bzoj 4546: codechef XRQRS [可持久化Trie]
4546: codechef XRQRS 可持久化Trie codechef上过了,bzoj上蜜汁re,看别人说要开5.2e5才行. #include <iostream> #includ ...
- 【xsy1147】 异或(xor) 可持久化trie
我的脑回路可能比较奇怪. 我们对这些询问离线,将所得序列${a}$的后缀和建$n$棵可持久化$trie$. 对于一组询问$(l,r,x)$,我们在主席树上询问第$l$棵树$-$第r$+1$棵树中与$s ...
随机推荐
- 【VUE】1.搭建一个webpack项目
1.npm之类的安装跳过 2.安装npm install -g @vue/cli-init 初始化项目目录 vue init webpack vue_cutter_point_blog_admin 并 ...
- delphi xe6 窗口 visible 不能隐藏 解决
delphi xe6 窗口 visible 不能隐藏 解决 在工程代码里面加上 Application.ShowMainForm := false;
- (转)为什么ssh一关闭,程序就不再运行了?
ref :https://www.cnblogs.com/lomper/p/7053694.html 问题描述 当SSH远程连接到服务器上,然后运行一个程序,eg: ./test.sh, 然后把终端开 ...
- -Gradle 翻译 Merge AndroidManifest 合并清单文件 MD
目录 目录 Merge AndroidManifest 合并清单文件 合并多个清单文件 合并优先级 合并冲突启发式算法 合并规则的标记 节点标记 属性标记 Attribute markers 标记选择 ...
- C# vb .net实现邮戳效果滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的邮戳效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- 使用Filezilla Server配置FTP服务器
一.下载Filezilla Server 官网网址:https://filezilla-project.org 二.安装Filezilla Server Filezilla Server的安 ...
- Python报错:ImportError: cannot import name 'ConnectionRefusedError'
启动了一个flask server,结果报了标题中的错误. ImportError: cannot import name 'ConnectionRefusedError' 解决: pip insta ...
- Django之创建超级用户
本文链接来自:https://blog.csdn.net/HuaCode/article/details/79721673 首选创建一个新用户,用来登录Django管理网站,进入manage.py目录 ...
- 【夯实基础】- Java中的fail-fast机制
转载自:Java中的fail-fast机制 遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过普通的for删除删除符合条件 ...
- 华为 mate30 安装谷歌助手
最近入手了 华为 mate30 pro, 作为一个8年的老果粉,在使用2天 mate30p 之后,给了耳目一新的感觉,不得不说这款手机真的很强大,各种优点我也不多说了,可以看网上各种专业的测评 但是手 ...