[BZOJ5338][TJOI2018]xor(可持久化Trie)
可持久化Trie模板题。
建两种可持久化Trie,每个点两棵,一棵对DFS求前缀和,一棵对祖先求前缀和。
或者树剖,不好写多少还多个log。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=;
int n,u,v,Q,x,y,z,op,nd,tim,cnt,t,a[N],rt1[N],rt2[N],fa[N][];
int h[N],to[N<<],nxt[N<<],L[N],R[N],dep[N],ch[N*][],d[N*]; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } void ins(int &x,int y,int k){
int tmp=++nd; x=tmp;
for (int i=; ~i; i--){
ch[x][]=ch[y][]; ch[x][]=ch[y][]; d[x]=d[y]+;
int t=(k>>i)&; ch[x][t]=++nd; x=ch[x][t]; y=ch[y][t];
}
d[x]=d[y]+; x=tmp;
} int cal1(int x,int y,int k){
int res=;
for (int i=; ~i; i--){
int t=((k>>i)&)^;
if (d[ch[y][t]]-d[ch[x][t]]) res^=<<i,x=ch[x][t],y=ch[y][t];
else x=ch[x][t^],y=ch[y][t^];
}
return res;
} int cal2(int s1,int s2,int s3,int s4,int k){
int res=;
for (int i=; ~i; i--){
int t=((k>>i)&)^;
if (d[ch[s1][t]]+d[ch[s2][t]]-d[ch[s3][t]]-d[ch[s4][t]])
res^=<<i,s1=ch[s1][t],s2=ch[s2][t],s3=ch[s3][t],s4=ch[s4][t];
else s1=ch[s1][t^],s2=ch[s2][t^],s3=ch[s3][t^],s4=ch[s4][t^];
}
return res;
} int Lca(int u,int v){
if (dep[u]<dep[v]) swap(u,v);
int t=dep[u]-dep[v];
for (int i=; ~i; i--) if (t&(<<i)) u=fa[u][i];
if (u==v) return u;
for (int i=; ~i; i--) if (fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[u][];
} void dfs(int x){
rep(i,,) fa[x][i]=fa[fa[x][i-]][i-];
L[x]=++tim; ins(rt1[tim],rt1[tim-],a[x]);
For(i,x) if ((k=to[i])!=fa[x][])
fa[k][]=x,ins(rt2[k],rt2[x],a[k]),dep[k]=dep[x]+,dfs(k);
R[x]=tim;
} int main(){
freopen("bzoj5338.in","r",stdin);
freopen("bzoj5338.out","w",stdout);
scanf("%d%d",&n,&Q);
rep(i,,n) scanf("%d",&a[i]);
rep(i,,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs();
while (Q--){
scanf("%d%d%d",&op,&x,&y);
if (op==) printf("%d\n",cal1(rt1[L[x]-],rt1[R[x]],y));
else scanf("%d",&z),t=Lca(x,y),printf("%d\n",cal2(rt2[x],rt2[y],rt2[t],rt2[fa[t][]],z));
}
return ;
}
[BZOJ5338][TJOI2018]xor(可持久化Trie)的更多相关文章
- BZOJ.5338.[TJOI2018]xor(可持久化Trie)
BZOJ LOJ 洛谷 惊了,18年了还有省选出模板题吗= = 做这题就是练模板的,我就知道我忘的差不多了 询问一就用以DFS序为前缀得到的可持久化Trie做,询问二很经典的树上差分. 注意求询问二的 ...
- BZOJ 5338: [TJOI2018]xor 可持久化trie+dfs序
强行把序列问题放树上,好无聊啊~ code: #include <bits/stdc++.h> #define N 200005 #define setIO(s) freopen(s&qu ...
- BZOJ_5338_ [TJOI2018]xor_可持久化trie
BZOJ_5338_ [TJOI2018]xor_可持久化trie Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...
- BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】
题目分析: 很无聊的一道题目.首先区间内单点对应异或值的询问容易想到trie树.由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问.case2维护dfs序,对d ...
- 可持久化trie(BZOJ5338: [TJOI2018]xor)
题面 BZOJ Sol 显然是要维护一个区域的 \(trie\) 树,然后贪心 区间 \(trie\) 树??? 可持久化 \(trie\) 树??? 直接参考主席树表示出区间的方法建立 \(trie ...
- 【xsy1147】 异或(xor) 可持久化trie
我的脑回路可能比较奇怪. 我们对这些询问离线,将所得序列${a}$的后缀和建$n$棵可持久化$trie$. 对于一组询问$(l,r,x)$,我们在主席树上询问第$l$棵树$-$第r$+1$棵树中与$s ...
- [BZOJ5338][TJOI2018]xor
bzoj luogu descirption 现在有一棵以 \(1\) 为根节点的由 \(n\) 个节点组成的树,树上每个节点上都有一个权值 \(v_i\) .现在有 \(Q\) 次操作,操作如下: ...
- BZOJ5338[TJOI2018]xor——主席树+dfs序
题目描述 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值vi. 现在有Q 次操作,操作如下: 1 x y 查询节点x的子树中与y异或结果的最大值 2 x y z ...
- [TJOI2018] Xor 异或 (可持久化Trie,树链剖分)
题目描述 现在有一颗以 1 为根节点的由 n 个节点组成的树,树上每个节点上都有一个权值 \(v_i\).现在有 Q 次操作,操作如下: 1 x y :查询节点 x 的子树中与 y 异或结果的最大值. ...
随机推荐
- php的几个面试题
1. mysql_num_fields() 返回结果集中字段的数目 如: $result = mysql_query("SELECT id,name,age FROM mydb.tb1 wh ...
- 【译】第十篇 SQL Server代理使用代理帐户
本篇文章是SQL Server代理系列的第十篇,详细内容请参考原文 在这一系列的上一篇,你查看了msdb库下用于授权访问SQL Server代理的安全角色.这些角色包括SQLAgentUserRole ...
- 【总结】前端框架:react还是vue?
之前写了一篇前端框架的大汇总,主要介绍了当下主流的框架和其特性.最近除了bootstrap,就属react和vue最为热门,这篇就主要拿这两个框架来做一下详细对比. 究竟如何正确使用?作为小白的我们从 ...
- UNIX环境高级编程 第4章 文件和目录
第三章说明了关于文件I/O的基本函数,主要是针对普通regular类型文件.本章描述文件的属性,除了regular文件还有其他类型的文件. 函数stat.fstat.fstatat和lstat sta ...
- Python图片验证码降噪 — 8邻域降噪
简介 图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是: 1.灰度处理&二值化 2.降噪 3.字符分割 4.标准化 5.识别 所谓降噪就是把不需 ...
- C# 链接webservice报错
未处理 System.ServiceModel.EndpointNotFoundException Message="没有终结点对可能接受消息的 http://192.168.0.168/ ...
- Python subprocess- call、check_call、check_output
简介 subprocess模块用来创建新的进程,连接到其stdin.stdout.stderr管道并获取它们的返回码.subprocess模块的出现是为了替代如下旧模块及函数:os.system.os ...
- python基础--类的方法
一:类的方法说明 类的方法分为实例方法,析构方法,构造方法,类方法,静态方法,属性方法,等等 类方法和静态方法都可以被类和类实例调用,类实例方法仅可以被类实例调用 类方法的隐含调用参数是类,而类实例方 ...
- java基础69 JavaScript产生伪验证码(网页知识)
1.伪验证码 <!doctype html> //软件版本:DW2018版 <html> <head> <meta charset="utf-8&q ...
- Oracle 函数 “把当前的用户(审核人,审核通过后)插入到数据表中”
create or replace function mcode_apply_update_personnel(p_mca_no VARCHAR2, -- 参数(实参) p_action VARCHA ...