【xsy1214】 异或路径(xorpath) 点分治+可持久化trie
题目大意:给你一棵$n$个点的树,每个点有一个点权$x$,问你所有路径中点权异或和最大的路径的异或和
数据范围:$n≤30000$,$x≤2^{31}-1$。
如果是边上有点权的话非常简单,直接一个$trie$就可以水过去了。
然而这题是点权,非常烦人。我们考虑用点分治去解决。
假设当前需要遍历的树的重心是$x$,我们开一个可持久化$trie$,我们用$son[x][i]$表示$x$的第$i$个儿子(我们假设总共有$p_x$个),将从$son[x][i]$出发的路径异或和加入第$[i,p_x]$个$trie$树中,当我们遍历出一条从$x$出发,经过$son[x][i]$的路径时,我们把这个路径的异或和放入第$i-1$个$trie$树中进行搜索。
我们已知点分治的时间复杂度是$O(n\ log\ n)$,由于这里面套了一个可持久化$trie$,那么时间复杂度就是$O(n\ log\ n\ log_2^{max{x}}$。
然后我的$trie$树出了锅,路径长度的最后一个二进制位没有被塞进$trie$中,然后成功$GG$
#include<bits/stdc++.h>
#define M 100005
#define INF 19260817
using namespace std; struct edge{int u,next;}e[M*]={}; int head[M]={},Use=;
void add(int x,int y){Use++;e[Use].u=y;e[Use].next=head[x];head[x]=Use;} int num[M]={},vis[M]={}; int siz[M]={}; void dfssiz(int x,int fa){
siz[x]=;
for(int i=head[x];i;i=e[i].next)
if(e[i].u!=fa&&vis[e[i].u]==){
dfssiz(e[i].u,x);
siz[x]+=siz[e[i].u];
}
}
int minn,minid;
void dfsmax(int x,int fa,int fasiz){
int maxn=fasiz-siz[x];
for(int i=head[x];i;i=e[i].next)
if(e[i].u!=fa&&vis[e[i].u]==){
dfsmax(e[i].u,x,fasiz);
maxn=max(maxn,siz[e[i].u]);
}
if(maxn<minn) minn=maxn,minid=x;
} int makeroot(int x){
dfssiz(x,);
minn=INF; minid=;
dfsmax(x,,siz[x]);
return minid;
} struct trie{
int a[];
}a[M*]={};int root[M]={},use=; void add(int &x,int zhi,int wei){
a[++use]=a[x]; x=use; int hh=;
if(wei<) return;
if((<<wei)&zhi) hh=;
add(a[x].a[hh],zhi,wei-);
}
int query(int x,int zhi,int wei){
if(wei<||x==) return ;
int hh=,ans=;
if((<<wei)&zhi) hh=;
if(!a[x].a[hh]) return query(a[x].a[hh^],zhi,wei-);
else return (<<wei)+query(a[x].a[hh],zhi,wei-);
} void dfsdis(int x,int fa,int hh,int cnt){
hh^=num[x];
add(root[cnt],hh,);
for(int i=head[x];i;i=e[i].next)
if(e[i].u!=fa&&vis[e[i].u]==){
dfsdis(e[i].u,x,hh,cnt);
}
} int ans=; void query(int x,int fa,int hh,int cnt){
hh^=num[x];
int now=query(root[cnt-],hh,);
ans=max(ans,now);
ans=max(ans,hh);
for(int i=head[x];i;i=e[i].next)
if(e[i].u!=fa&&vis[e[i].u]==){
query(e[i].u,x,hh,cnt);
}
} void calc(int x){
int cnt=;
for(int i=head[x];i;i=e[i].next)
if(vis[e[i].u]==){
cnt++; root[cnt]=root[cnt-];
dfsdis(e[i].u,x,,cnt);
}
cnt=;
for(int i=head[x];i;i=e[i].next)
if(vis[e[i].u]==){
cnt++;
ans=max(ans,num[x]);
query(e[i].u,x,num[x],cnt);
}
use=; memset(root,,(cnt+)<<);
} void dfs(int x){
x=makeroot(x); vis[x]=;
calc(x);
for(int i=head[x];i;i=e[i].next)
if(vis[e[i].u]==) dfs(e[i].u);
} int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n; scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",num+i);
for(int i=;i<n;i++){
int x,y; scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
dfs();
cout<<ans<<endl;
}
【xsy1214】 异或路径(xorpath) 点分治+可持久化trie的更多相关文章
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- bzoj 4137 [FJOI2015]火星商店问题【CDQ分治+可持久化trie】
其实我不太清楚这个应该叫CDQ分治还是整体二分 参考:http://blog.csdn.net/lvzelong2014/article/details/78688727 一眼做法是线段树套可持久化t ...
- [FJOI2015]火星商店问题(线段树分治+可持久化Trie)
重新写一年前抄题解的那题,当时我啥都不会只是Ctrl+C,Ctrl+V写过的题,今天重新写一遍. 题解: 不会线段树分治,还是学一下这东西吧,这是我的第一道线段树分治. 首先对于特殊商品,可以直接可持 ...
- 【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie
感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #d ...
- P4735 最大异或和 /【模板】可持久化Trie
//tire的可持久化 //线段树的可持久化——主席树 //可持久化的前提:本身的拓扑结构在操作时不变 //可以存下来数据结构的所有历史版本 //核心思想:只记录每一个版本与前一个版本不一样的地方 / ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- 【洛谷5283】[十二省联考2019] 异或粽子(可持久化Trie树+堆)
点此看题面 大致题意: 求前\(k\)大的区间异或和之和. 可持久化\(Trie\)树 之前做过一些可持久化\(Trie\)树题,结果说到底还是主席树. 终于,碰到一道真·可持久化\(Trie\)树的 ...
- BZOJ_3697_采药人的路径_点分治
BZOJ_3697_采药人的路径_点分治 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性 ...
随机推荐
- 20155235 2016-2017-2 《Java程序设计》第7周学习总结
20155235 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambda 认识Lambda语法 Lambda语法概览 Lambda表达式与函数 ...
- 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)
传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...
- Nginx upstream的5种权重分配方式(转)
出处:http://www.cnblogs.com/funsion/p/4003499.html?utm_source=tuicool 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器, ...
- dubbo在eclipse中无法读取到dubbo.xsd
报错信息如下: Multiple annotations found at this line:– cvc-complex-type.2.4.c: The matching wildcard is s ...
- UniGui之锱铢积累(仔细看这个文件)
http://www.doc88.com/p-4022977294324.html 这个是Word文档
- 谈谈XAML前端开发
GUI的发展 在图形用户界面的操作系统(Windows,MAC)出现之前,计算机软件是命令行界面的程序,用户和程序的交互是通过输入命令,查看命令运行结果进行的.当然很不友好.后来出现了文本图形界面的程 ...
- Android Studio 集成 TFS,实现安卓移动开发的持续集成和交付(DevOps)
目录 1 集成TFS系统.... 1.1 概述.... 1.2 安装TFS插件.... 1.2.1 在线安装方式.... 1.2.2 离线安装方案.... 1.3 常见操作.... 1.3.1 新建G ...
- Windows Server 2012 R2部署--安装桌面体验
Windows Server 2012 R2部署(3)---安装桌面体验 1) 打开服务器管理器 2) 选择所有服务器 3)添加角色和功能 4)下一步 5)下一步 6)下一步 ...
- mysql恢复备份错误:Got a packet bigger than 'max_allowed_packet' bytes
最近恢复mysql数据库备份时,出现了一个错误:Got a packet bigger than 'max_allowed_packet' bytes 该问题主要是由于mysql的my.ini文件中设 ...
- Asp.Net从相对路径获取绝对路径的方法(不需要httpcontext上下文也可)
//如果拿不到当前HttpContext上下文的话可以用该方法取得绝对路径 var filePath = HostingEnvironment.MapPath("需要获取绝对路径 的 相对路 ...