吐槽

睡起来写道模板清醒一下

貌似有两个log的树剖写法,还有一个log的Trie树的差分做法(类似于count on a tree),然后一个log的要把两个询问分开写,一个dfs序一个差分,然后我就写了好写的树剖写法

以及为啥出题人这么喜欢把序列问题放到树上啊。。。

可持久化Tried树模板难度,懒得写思路

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 100100;
struct Node{
int son[2],sz;
}Trie[MAXN*40];
const int MAXlen=30;
int u[MAXN<<1],v[MAXN<<1],w[MAXN],nxt[MAXN<<1],root[MAXN],dep[MAXN],fir[MAXN],id[MAXN],top[MAXN],sz[MAXN],heason[MAXN],fa[MAXN],cnt,dfs_clock,w_p[MAXN],n,m,Nodecnt;
void addedge(int ui,int vi){
++cnt;
u[cnt]=ui;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
void dfs1(int u,int f){
sz[u]=1;
fa[u]=f;
dep[u]=dep[f]+1;
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==f)
continue;
dfs1(v[i],u);
sz[u]+=sz[v[i]];
if(heason[u]==0||sz[heason[u]]<sz[v[i]])
heason[u]=v[i];
}
}
void dfs2(int u,int topf){
id[u]=++dfs_clock;
w[id[u]]=w_p[u];
top[u]=topf;
if(!heason[u])
return;
dfs2(heason[u],topf);
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==fa[u]||v[i]==heason[u])
continue;
dfs2(v[i],v[i]);
}
}
void insert(int d,int val,int &o){
Trie[++Nodecnt]=Trie[o];
o=Nodecnt;
Trie[o].sz++;
if(d>=0)
insert(d-1,val,Trie[o].son[(val>>d)&1]);
}
int query(int lroot,int rroot,int val,int d){
if(d<0)
return 0;
int flag=(val>>d)&1;
if(Trie[rroot].son[!flag]>Trie[lroot].son[!flag])
return (1<<d)+query(Trie[lroot].son[!flag],Trie[rroot].son[!flag],val,d-1);
else
return query(Trie[lroot].son[flag],Trie[rroot].son[flag],val,d-1);
}
void build(void){
for(int i=1;i<=dfs_clock;i++){
root[i]=root[i-1];
insert(MAXlen,w[i],root[i]);
}
}
int query(int x,int y,int c){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])
swap(x,y);
ans=max(ans,query(root[id[top[x]]-1],root[id[x]],c,MAXlen));
x=fa[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
ans=max(ans,query(root[id[x]-1],root[id[y]],c,MAXlen));
return ans;
}
int query(int x,int c){
return query(root[id[x]-1],root[id[x]+sz[x]-1],c,MAXlen);
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&w_p[i]);
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
addedge(a,b);
addedge(b,a);
}
dfs1(1,0);
dfs2(1,1);
build();
for(int i=1;i<=m;i++){
int opt,x,y,z;
scanf("%d %d %d",&opt,&x,&y);
if(opt==1){
printf("%d\n",query(x,y));
}
else{
scanf("%d",&z);
printf("%d\n",query(x,y,z));
}
}
return 0;
}

P4592 [TJOI2018]异或的更多相关文章

  1. 洛谷 P4592 [TJOI2018]异或 解题报告

    P4592 [TJOI2018]异或 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\(v_i\).现在有\(Q\)次操作,操作如下: 1 x y:查 ...

  2. P4592 [TJOI2018]异或 (可持久化Trie)

    [题目链接] https://www.luogu.org/problemnew/show/P4592 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\ ...

  3. [洛谷P4592][TJOI2018]异或

    题目大意:有一棵$n$个点的树,第$i$个点权值为$w_i$,有两种操作: $1\;x\;y:$询问节点$x$的子树中与$y$异或结果的最大值 $2\;x\;y\;z:$询问路径$x$到$y$上点与$ ...

  4. 洛谷P4592 [TJOI2018]异或(可持久化01Trie)

    题意 题目链接 可持久化01Trie板子题 对于两个操作分别开就行了 #include<bits/stdc++.h> using namespace std; const int MAXN ...

  5. 洛谷P4592 [TJOI2018]异或 【可持久化trie树】

    题目链接 BZOJ4592 题解 可持久化trie树裸题 写完就A了 #include<algorithm> #include<iostream> #include<cs ...

  6. 【BZOJ5338】[TJOI2018]异或(主席树)

    [BZOJ5338][TJOI2018]异或(主席树) 题面 洛谷 题解 很明显的是\(Trie\)树上暴力判断答案 因为要支持区间,用主席树的结构存\(Trie\)树就好了 #include< ...

  7. 洛谷 P4592: bzoj 5338: [TJOI2018]异或

    题目传送门:洛谷P4592. 题意简述: 题面说的很清楚了. 题解: 发现没有修改很快乐.再看异或最大值操作,很容易想到可持久化 01trie. 这里要把 01trie 搬到树上,有点难受. 树剖太捞 ...

  8. 可持久化01Trie树+LCA【p4592】[TJOI2018]异或

    Description 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\(v_i\).现在有\(Q\)次操作,操作如下: 1\(\;x\;y\):查询节点\(x ...

  9. [TJOI2018]异或

    Description: 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值v ​现在有Q次操作,操作如下: 1.1 x y :查询节点x的子树中与y异或结果的最大值 2.2 x  ...

随机推荐

  1. 4.无监督学习--K-means聚类

    K-means方法及其应用 1.K-means聚类算法简介: k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低.主要处理过程包括: 1.随机选择k个点作为 ...

  2. Keras中使用LSTM层时设置的units参数是什么

    https://www.zhihu.com/question/64470274 http://colah.github.io/posts/2015-08-Understanding-LSTMs/ ht ...

  3. mysql运用now(3)存储时间到毫秒

    ) from DUAL;

  4. Dirichlet分布深入理解

    Dirichlet分布 我们把Beta分布推广到高维的场景,就是Dirichlet分布.Dirichlet分布定义如下 Dirichlet分布与多项式分布共轭.多项式分布定义如下 共轭关系表示如下 D ...

  5. GUI相应鼠标事件

    function varargout = GUI18(varargin) % GUI18 MATLAB code for GUI18.fig % GUI18, by itself, creates a ...

  6. webstorm's interpreter

    下载node.js 地址:http://nodejs.cn/ next——> Node interpreter: ……/……/node.exe

  7. Oracle 手动建库

    Oracle在创建实例的时候,多数采用的是dbca的形式..其实手动建库可以提供更大的自由发挥的空间,根据情况进行定制 登录Oracle用户 指定SID(Instance Identifier) ex ...

  8. An Example of How Oracle Works

    Oracle是怎么工作的,摘自Oracle 9i的官方文档 The following example describes the most basic level of operations tha ...

  9. django模板-自定义标签、过滤器

    自定义标签或者过滤器的步骤 ①将要创建自定义标签或过滤器的app加入settings文件的installed_apps中 ②在app中创建templatetags目录,类型为包即packages ③在 ...

  10. 01: docker 基本使用

    1.1 docker基础 1.docker与虚拟机比较 2.docker版本 1. 社区版(Community Edition, CE) 2. 企业版(Enterprise Edition, EE) ...