LOJ6115 汇合 树上分块
本题空间很小,那些O(nlogn)的树上lca算法在这里不顶用了,可以考虑树分块。
本题的树分块是基于深度的,即按深度每\(\sqrt n\)分一块,然后一块一块往上跳,一直跳到lca处。
对于这题,有这样几种做法:
考虑在树上选择若干关键点,每次求lca先往上跳到最近的关键点处,然后再一个一个关键点往上跳,直到跳到同一关键点处。至于关键点的选择,可以这样做:
从浅到深依次从每一个点出发,如果向上跳 2S-1 个节点都没有关键点,则将其 S 级祖先设为关键点。这样关键点个数严格小于 n/S , 同时每个关键点到它父亲方向的第一个关键点的距离都等于 S 。并且从每个点向上跳,到第一个关键点所需步数 < 2S 。
当然也可以在树上随机\(\sqrt n\)个关键点,这样复杂度期望是\(O(\sqrt n)\)的。
还有神仙psj提供的一种做法,就是记录下每个点向上跳\(\sqrt n\)次的祖先,然后每次查询的时候先将两个点跳到同一深度(深度可以在跳之前\(O(\sqrt n)\)查询得到,跳的时候动态维护),然后像倍增lca那样能往上跳就往上跳,只不过步长是\(\sqrt n\)的,最后在一步一步跳到lca处。这种做法的空间是上面做法的两倍,得卡一卡空间才能过。
这里我写的是第一种做法,具体细节可以参考代码:
#include<cstdio>
#include<bitset>
#include<algorithm>
using namespace std;
#define N 900007
#define M 5007
const int t=300;
int fa[N],a[M],top[M],dep[M],cnt;
bitset<N> tag;
void mark(int x)
{
int v=fa[x],i;
for(i=1;i<2*t&&!tag[v];i++)
v=fa[v];
if(i==2*t)
{
for(i=1;i<=t;i++)
x=fa[x];
a[++cnt]=x;
tag[x]=1;
}
}
int getpos(int x)
{
int p=lower_bound(a+1,a+cnt+1,x)-a;
return p;
}
int find(int x)
{
while(!tag[x])x=fa[x];
return x;
}
int getdep(int x,int y)
{
int d=0;
while(x!=y)
d++,x=fa[x];
return d;
}
int getkth(int x,int k)
{
int i;
for(i=1;i<=k;i++)
x=fa[x];
return x;
}
int main()
{
int n,m,i,x,y;
scanf("%d%d",&n,&m);
for(i=2;i<=n;i++)
{
scanf("%d",&x);
fa[i]=x;
}
tag[1]=1;
a[++cnt]=1;
for(i=2;i<=n;i++)
mark(i);
sort(a+1,a+cnt+1);
dep[1]=1;
for(i=2;i<=cnt;i++)
{
top[i]=getpos(find(fa[a[i]]));
dep[i]=dep[top[i]]+1;
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
int u=find(x),v=find(y);
u=getpos(u),v=getpos(v);
if(dep[v]>dep[u])swap(x,y),swap(u,v);
while(dep[u]>dep[v])
{
x=a[u];
u=top[u];
}
while(u!=v)
{
x=a[u],u=top[u];
y=a[v],v=top[v];
}
int dx=getdep(x,a[u]),dy=getdep(y,a[v]);
if(dy>dx)swap(x,y),swap(dx,dy);
x=getkth(x,dx-dy);
while(x!=y)
x=fa[x],y=fa[y];
printf("%d\n",x);
}
return 0;
}
LOJ6115 汇合 树上分块的更多相关文章
- 洛谷P2325王室联邦 SCOI2005 构造+树上分块
正解:构造 解题报告: 照例先放传送门 umm其实我jio得这题应该在教树上莫队的时候港,应该是用来帮助理解树上莫队的分块方式的 然而这题是在学了树上分块之后再遇到的?就显得没那么难了吼 然后就随便说 ...
- [bzoj 3720] Gty的妹子树 (树上分块)
树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...
- BZOJ 1086: [SCOI2005]王室联邦 [树上分块]
portal 题意: 树分成若干块大小在$[s,3s]$之间,每块有一个根(可以不在块内),所有点到根路径上的点都必须在块内 据说这是一个保证了块大小直径个数的科学分块方法,貌似只有本题有用 我错了 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树上分块+dfs序+线段树)
题意 链接:https://nanti.jisuanke.com/t/A1998 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L(根 ...
- CodeChef TRIPS-Children Trips 树上分块
参考文献国家集训队2015论文<浅谈分块在一类在线问题的应用>-邹逍遥 题目链接 题目大意 一棵n个节点的树,树的每条边长度为1或2,每次询问x,y,z. 要求输出从x开始走,每次只能走到 ...
- 【分块】【树上莫队】bzoj1086 bzoj3052
1086 http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ 3052 http://vfleaking.blog. ...
- BZOJ 3720: Gty的妹子树 [树上size分块]
传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...
- SPOJ COT2 树上找路径上不同值的个数
题目大意 给出多个询问u , v , 求出u-v路径上点权值不同的个数 开始做的是COT1,用主席树写过了,理解起来不难 很高兴的跑去做第二道,完全跟普通数组区间求k个不同有很大区别,完全没思路 膜拜 ...
- BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)
4129: Haruna’s Breakfast Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 835 Solved: 409[Submit][St ...
随机推荐
- 纯 css 打造一个小提示 tooltip
最后编辑:2019/11/26 前 无意间在寻找资料时候,发现一个不错的小提示,查看源码竟然是纯手工 css 编写(文章底部参考链接). 效果 使用的特性 css2 中的 attr 函数,所以现在(2 ...
- win10 配置IIS
互联网信息服务(英語:Internet Information Services),在台湾被称为网际网路资讯服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是W ...
- Debian kvm网络配置
安装brctl apt-get install bridge-utils 设置网桥 可编辑 /etc/network/interface 文件.不过,我建议在 /etc/network/interfa ...
- 官方elasticsearch-certutiledit命令
地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/certutil.html 语法: bin/elasticsearch-c ...
- 缓存雪崩、穿透如何解决,如何确保Redis只缓存热点数据?
缓存雪崩如何解决? 缓存穿透如何解决? 如何确保Redis缓存的都是热点数据? 如何更新缓存数据? 如何处理请求倾斜? 实际业务场景下,如何选择缓存数据结构 缓存雪崩 缓存雪崩简单说就是所有请求都从缓 ...
- python 双层for循环,在第二层的for循环中的else中的continue,会退出到第一层for循环继续执行
for a in [1,2,3,4,5]: for b in [1,2,3]: if a == b: print("a = b = %s" % a) break # 退出本次for ...
- English--辅音
English|辅音 英语中的辅音,按照发音的松紧,唇形舌位,划分为七大类.需要好好地体会具体的发音部位与口型. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含 ...
- https网站部署成功 CA证书申请 IIS配置
https://www.cnblogs.com/lichunting/p/9274422.html#4276645 参考文档解决方案
- 浅谈华为验厂对MES系统的要求
众所周知,华为对供应商在管理.防错.品控.追溯等方面的要求都非常严格.在华为验厂时,对供应商的信息系统,尤其是MES系统的评估也是有非常具体的要求.那么我们今天就来谈谈华为验厂时,对MES系统有哪些具 ...
- ant笔记
目录 ant远程部署 ant的使用,命令! 参考文献: ant+maven一键打包springboot上传服务器发布 判断linux文件.文件夹是否存在 shell中脚本参数传递的两种方式 shell ...