P4592 [TJOI2018]异或

P4592 [TJOI2018]异或

题意:

现在有一颗以 1 为根节点的由 n 个节点组成的树,节点从 1 至 n 编号。树上每个节点上都有一个权值 vi。现在有 q 次操作,操作如下:
1 x z:查询节点 x 的子树中的节点权值与 z 异或结果的最大值。
2 x y z:查询节点 x 到节点 y 的简单路径上的节点的权值与 z 异或结果最大值。

题解:

很明显的可持久化01Trie
对于第一个问题,直接按照时间戳(DFS序)建立点权的可持久化01Trie,每次查询就是对区间[dfn[u],dfn[u]+siz[u]-1]的询问,(u的所有儿子都被包含在这个区间内)
关于第二个问题,我们都知道对于u->v的路径,我们可以拆分成rt到u,rt到v,rt到lca,rt到fa[lca](老套路了)这四套路径,建立rt到所有点的可持久化01Trie,然后查询这四条路找到答案
相当于对于两问建了两个可持久化01Trie

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); //计时开始freopen("in.txt","r",stdin);#endif
}
void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); //计时结束printf("\n运行时间为:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif
}
int n,m,sum,dep[200001],a[200001],ktot,size[200001],tpos[200001],pre[200001],head[200001],tot,f[200001][25];
struct edge{int to,next;
}g[1000001];
inline void made(int from,int to){g[++tot].to=to;g[tot].next=head[from];head[from]=tot;
}
struct Trie{int n,son[10000001][2],cnt=1,sum,root[200001],ct[10000001];void ins(int &rt,int x,int T){ct[++cnt]=ct[rt]+1;son[cnt][0]=son[rt][0];son[cnt][1]=son[rt][1];rt=cnt;if (T==-1) return;register bool y=(x>>T)&1;ins(son[rt][y],x,T-1);}inline void insert(int pre,int rt,int x){root[rt]=root[pre];ins(root[rt],x,30);}int QUE(int i,int j,int x,int T){//序列版if (T==-1) return 0;register bool y=(x>>T)&1;if (ct[son[j][1^y]]>ct[son[i][1^y]]) return ((1<<T)+QUE(son[i][1^y],son[j][1^y],x,T-1));else return QUE(son[i][y],son[j][y],x,T-1);}int queryxx(int i,int j,int lca,int fa,int x,int T){//树上差分版if (T==-1) return 0;register bool y=(x>>T)&1;if (ct[son[j][1^y]]+ct[son[i][1^y]]>ct[son[lca][1^y]]+ct[son[fa][1^y]]) return ((1<<T)+queryxx(son[i][1^y],son[j][1^y],son[lca][1^y],son[fa][1^y],x,T-1));else return queryxx(son[i][y],son[j][y],son[lca][y],son[fa][y],x,T-1);}int queryx(int i,int j,int lc,int flc,int x,int T){return queryxx(root[i],root[j],root[lc],root[flc],x,T);}inline int query(int l,int r,int x){return QUE(root[l-1],root[r],x,30);}
}tr1,tr2;
void dfs0(int u,int fa){dep[u]=dep[fa]+1;f[u][0]=fa;tpos[u]=++ktot;pre[ktot]=u;tr1.insert(fa,u,a[u]);size[u]=1;for (int i=1;i<=21;i++) f[u][i]=f[f[u][i-1]][i-1];for (int i=head[u];i;i=g[i].next){int v=g[i].to;if (v==fa) continue;dfs0(v,u);size[u]+=size[v];}
}
inline int LCA(int x,int y){if (dep[x]<dep[y]) swap(x,y);for (int i=21;i>=0;i--){if (dep[f[x][i]]>=dep[y]) x=f[x][i];}if (x==y) return x;for (int i=21;i>=0;i--){if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];}return f[x][0];
}
int main(){rd_test();n=read();m=read();for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<n;i++){int x=read(),y=read();made(x,y);made(y,x);}dfs0(1,0);for (int i=1;i<=n;i++){tr2.insert(i-1,i,a[pre[i]]);}while (m--){int opt=read();if (opt==1){int x=read(),y=read();printf("%d\n",tr2.query(tpos[x],tpos[x]+size[x]-1,y));}else{int x=read(),y=read(),z=read();int lca=LCA(x,y);printf("%d\n",tr1.queryx(x,y,lca,f[lca][0],z,30));}}Time_test();
}

写的另一个还没改完的代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
//Fe~Jozky
clock_t startTime, endTime;
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); //计时开始freopen("in.txt","r",stdin);#endif
}
void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); //计时结束printf("\n运行时间为:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif
}
const int maxn=3e5+9;
vector<int>vec[maxn];
struct tree{int cnt=0;int ch[3];
}tr[maxn*40];
int rt[maxn];
int a[maxn];
int fa[maxn][25], dep[maxn], lg[maxn];
int rtnum=0;
int dfn[maxn],predfn[maxn];
int dfnnum=0;
int siz[maxn];
int newa[maxn];
void insert(int now,int pre,int x){for(int i=30;i>=0;i--){int c=((x>>i)&1);tr[now].ch[c^1]=tr[pre].ch[c^1];tr[now].ch[c]=++rtnum;now=tr[now].ch[c];pre=tr[pre].ch[c];tr[now].cnt=tr[pre].cnt+1;}
}
int query(int L,int R,int x){int sum=0;for(int i=30;i>=0;i--){int c=((x>>i)&1);if(tr[tr[R].ch[c^1]].cnt>tr[tr[L].ch[c^1]].cnt){sum+=(1<<i);L=tr[L].ch[c^1];R=tr[R].ch[c^1]; }else {L=tr[L].ch[c];R=tr[R].ch[c]; }}return sum;
}
void dfs(int now,int fath){siz[now]=1;dep[now]=dep[fath]+1;fa[now][0]=fath;for(int i=1;(1<<i)<=dep[now];i++)fa[now][i]=fa[fa[now][i-1]][i-1];dfn[now]=++dfnnum;newa[dfnnum]=a[now];//predfn[dfnnum]=now;for(int i=0;i<vec[now].size();i++){if(vec[now][i]!=fath){dfs(vec[now][i],now);siz[now]+=siz[vec[now][i]];}}
}
int LCA(int x,int y){if(dep[x]<dep[y])swap(x,y);while(dep[x]>dep[y])x=fa[x][lg[dep[x]]-dep[y]];if(x==y)return x;for(int i=lg[dep[x]];i>=0;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}}return fa[x][0];
}
int main()
{rd_test(); int n,m;cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<n;i++){int u,v;cin>>u>>v;vec[u].push_back(v);vec[v].push_back(u);}lg[0]=-1;for(int i=1;i<=n;i++)lg[i]=lg[i>>1]+1;dfs(1,0);rt[0]=++rtnum;insert(rt[0],0,0);int tot=0;for(int i=1;i<=dfnnum;i++){tot^=newa[i];rt[i]=++rtnum;insert(rt[i],rt[i-1],tot);}for(int i=1;i<=m;i++){int op;scanf("%d",&op);int x,y,z;if(op==1){scanf("%d%d",&x,&z);int ans=query(rt[dfn[x]-1],rt[dfn[x]+siz[x]-1],z);printf("%d\n",ans);}else {scanf("%d%d%d",&x,&y,&z);if(dfn[x]>dfn[y])swap(x,y);int lca=LCA(x,y);//int ans=max(query(rt[dfn[lca]-1],rt[dfn[x]],z),query(rt[dfn[x]+siz[x]-1],rt[dfn[y]],z));cout<<"???"<<endl;}}Time_test(); 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[HAOI2018] 染色(二项式反演+NTT)

洛谷链接 显然颜色数量不会超过 lim⁡min⁡(m,ns)\lim\min(m,\frac ns)limmin(m,sn​) fi:f_i:fi​: 至少有 iii 种颜色恰好出现了 sss 次的方案数。 则 fi(mi)⋅n!(s!)i(n−is)!⋅(m−i)n−isf_i\binom mi\frac{n!}{(s!)^i(n-is)!}(m-i)^{n-is}fi​(im​)⋅(s!)i(n−is)!n!​…

使用 Nexus3镜像搭设私有仓库(Bower 、Docker、Maven、npm、NuGet、Yum、PyPI)

Docker - 使用 Nexus3 搭设私有 NuGet 仓库Nexus 默认帐号Repositories上传组件包(Package)Repositories 说明准备 Package上传 Package使用 Package拉取 Nexus 镜像运行 NexusNuGetNexus 私有仓库前言说明安装Nexus NuGet 仓库简单使用总结前言NuGetNuget 是免费、开源的包管理…

P3293 [SCOI2016]美味

P3293 [SCOI2016]美味 题意&#xff1a; 有n个数组a&#xff0c;现在有m个询问&#xff0c;每次给出一个b和x&#xff0c;问b xor (a[i] x)的最大值是多少&#xff1f; 题解&#xff1a; 不难看出01Trie的题目 我们设ansa[i]x,我们想要b xor ans的最大值&#xff0c;这个很…

[HNOIAHOI2018] 转盘(线段树维护单调栈)

problem 洛谷链接 solution 结论&#xff1a;最优方案中一定有一种是全程不停的。 断环成链&#xff0c;接一个 [1,n][1,n][1,n] 在后面形成 2n2n2n 的序列&#xff0c;同时将时间戳逆过来。 转化成&#xff1a;在 ttt 时刻从某个位置 i∈[n,2n)i\in[n,2n)i∈[n,2n) 开始往…

P2446 [SDOI2010]大陆争霸

P2446 [SDOI2010]大陆争霸 题意&#xff1a; n个点&#xff0c;m个边&#xff0c;wi为每个边的边权&#xff0c;对于每个点i&#xff0c;其被l个点保护着&#xff0c;也就是如果保护其的点没有被破坏&#xff0c;点i无法被破坏(也无法经过其前往其他点)。现在从1出兵(无限数量…

EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

DbContextPool 是 ASP.NET Core 2.1 引入的新特性&#xff0c;可以节省创建 DbContext 实例的开销&#xff0c;但没有想到其中藏着一个小坑。最近有一个 ASP.NET Core 项目持续运行一段时间后日志中就会出现数据库连接池达到最大连接数限制的错误&#xff1a;System.InvalidOpe…

AtCoder4505 [AGC029F] Construction of a tree(二分图+网络流+dfs+构造)

problem 洛谷链接 solution 考虑 Ω{E1,...,En−1}\Omega\{E_1,...,E_{n-1}\}Ω{E1​,...,En−1​} 的一个子集 SSS&#xff0c;记 f(S){u∣u∈Ei∈S}f(S)\{u\mid u\in E_i\in S\}f(S){u∣u∈Ei​∈S}。 显然当 S≠∅∧∣f(S)∣≤∣S∣S\ne\empty\wedge\big|f(S)\big|\le |…

P2447 [SDOI2010]外星千足虫

P2447 [SDOI2010]外星千足虫 题意&#xff1a; 有n个未知数 给你一个m行n1列的式子&#xff0c;对于每行&#xff0c;1到n列为这个n个未知数的系数&#xff0c;第n1列为该行式子的和mod2&#xff0c;问n个未知数是否有唯一解&#xff0c;并输出&#xff0c;并输出最少需要前k…

Kubernetes架构为什么是这样的?

小编序&#xff1a;在上周发布的《从“鸿沟理论”看云原生&#xff0c;哪些技术能够跨越鸿沟&#xff1f;》一文中&#xff0c;灵雀云CTO陈恺表示&#xff1a;Kubernetes在云计算领域已经成为既定标准&#xff0c;进入主流市场&#xff0c;最新版本主要关注在稳定性、可扩展性方…

AtCoder4380 [AGC027F] Grafting(拓扑排序)

problem 洛谷链接 solution 首先特判掉两棵树一开始就相同的情况。 那么接下来就是一定要操作才能相同的情况了。 群龙无首不行&#xff0c;我们先定根。不妨枚举第一步的叶子操作&#xff0c;即枚举叶子以及其接的点。 然后对于 A,BA,BA,B 都以这个叶子为根&#xff0c;…

开源 , KoobooJson一款高性能且轻量的JSON框架

在C#领域&#xff0c;有很多成熟的开源JSON框架&#xff0c;其中最著名且使用最多的是 Newtonsoft.Json ,然而因为版本迭代,其代码要兼容从net2.0到现在的最新的net框架,并且要支持.net平台下的其它语言,所以最新发布版本的Newtonsoft.Json其dll大小接近700k,另一方面,因为其复…

高斯消元模板

高斯消元通用 #include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std;const int MAXN50;int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool free_x[MAXN];//标记是否是不确…

[CodeForces gym 102956 D] Bank Security Unification(位运算优化dp)

problem cf链接 solution 读完题先直接暴力 dpdpdp 拿出来&#xff0c;dpimax⁡j<i{dpj(fi&fj)}dp_i\max_{j<i}\big\{dp_{j}(f_i\&f_j)\big\}dpi​maxj<i​{dpj​(fi​&fj​)}。 谁能优化谁就是爸爸 假设存在 j<k<ij<k<ij<k<i&…

P2403 [SDOI2010]所驼门王的宝藏

P2403 [SDOI2010]所驼门王的宝藏 题意&#xff1a; R * C的地图上有n个宝藏&#xff0c;给你n个宝藏的坐标&#xff0c;每个宝藏的位置上还有一个传送门&#xff0c;传送门有三种类型&#xff0c;1.可以传送到同行的其他宝藏位置&#xff0c;2.可以传送到同列的其他宝藏位置 …

分布式系统的构建原则

什么是构建一个可维护和可扩展的系统的意义&#xff1f;在早期&#xff0c;一个系统的形态&#xff0c;只是满足用户和服务器资源之间的通道&#xff0c;唯一要扩展和维护的是系统后面的资源&#xff0c;保证资源的可用和够用&#xff0c;而系统本身的压力并不大。系统设计跟我…

[HEOI2016TJOI2016]排序(二分+线段树)

problem 洛谷链接 solution 在一个丝毫没有单调性的问题中很难想到将其转化为二分。 二分最后在第 ppp 位置上的值 xxx。 然后将所有 ≥x\ge x≥x 的赋为 111&#xff0c;所有 <x<x<x 的赋为 000。 经过一系列区间排序操作后&#xff0c;最后我们只在乎第 ppp 位…

可持久化4--可持久化并查集

可持久化并查集 可持久化并查集 按秩合并并查集 可持久化数组 首先并查集不能采用路径压缩&#xff0c;这是因为一次findR操作中&#xff0c;fa数组的很多位置&#xff08;u->ru&#xff09;会发生修改&#xff0c;由于每次修改都需要在可持久化数组上复制产生log个新结…

ASP.NET Core 2.2中的Endpoint路由

在ASP.NET Core 2.2中&#xff0c;新增了一种路由&#xff0c;叫做Endpoint&#xff08;终结点&#xff09;路由。本文将以往的路由系统称为传统路由。本文通过源码的方式介绍传统路由和Endpoint路由部分核心功能和实现方法&#xff0c;具体功能上的差异见官方文档。在升级到AS…

AtCoder2063 [AGC005E] Sugigma The Showdown(博弈论)

problem 洛谷链接 solution 考虑一条 (u,v)(u,v)(u,v) 的红边&#xff0c;在蓝树上 u,vu,vu,v 两点距离 ≥3\ge 3≥3。 如果先手到达 u,vu,vu,v 其中任何一点且下一步后手行动无法抓住先手&#xff0c;那么这个游戏就将进入死循环了。 通过画图&#xff0c;你会发现这个结…

基于ASP.NET Core的模块化设计: 虚拟文件系统

土牛亲自录制的本文介绍视频Abp中文网(https://cn.abp.io/)提供翻译字幕基于ASP.NET Core的模块化设计: 虚拟文件系统简介创建模块化的应用程序很困难. 构建模块化的用户界面更加困难. 需要单独开发模块的页面和组件,但是最后要把它们集成在一起像单个UI一样创建这样的模块化架…