#长链剖分#CF208E Blood Cousins
题目
给你一片森林,每次询问一个点与多少个点拥有共同的 \(K\) 级祖先
分析
设\(dp[x][d]\)表示以\(x\)为根节点时深度为\(d\)的个数,
那么\(dp[x][d]=\sum\{dp[y][d-1]\}\)
这个考虑用长链剖分维护就可以做到\(O(n)\)
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=100011; struct node{int y,next;}e[N],E[N]; int puf[N]; int *dp[N],*st=puf;
int dep[N],dfn[N],sta[N],big[N],F[N],Top,d[N],ans[N],n,Q,et,rt[N],as[N],hs[N],Hs[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void add(int x,int y){
if (!x) {rt[++rt[0]]=y; return;}
e[++et]=(node){y,as[x]},as[x]=et;
}
inline void dfs1(int x,int fa){
dep[x]=dep[fa]+1,sta[++Top]=x;
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa){
dfs1(e[i].y,x);
if (d[e[i].y]>d[big[x]]) big[x]=e[i].y;
}
for (rr int i=hs[x];i;i=E[i].next)
if (Top>=E[i].y) F[i]=sta[Top-E[i].y];
--Top,d[x]=d[big[x]]+1;
}
inline void dfs2(int x,int fa){
dp[x][0]=1;
if (!big[x]) return;
dp[big[x]]=dp[x]+1,dfs2(big[x],x);
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa&&e[i].y!=big[x]){
dp[e[i].y]=st,st+=d[e[i].y],dfs2(e[i].y,x);
for (rr int j=1;j<=d[e[i].y];++j)
dp[x][j]+=dp[e[i].y][j-1];
}
for (rr int i=hs[x];i;i=E[i].next)
ans[i]=dp[x][E[i].y]-1;
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i) add(iut(),i);
Q=iut();
for (rr int i=1;i<=Q;++i){
rr int x=iut(),d=iut();
E[i]=(node){d,hs[x]},hs[x]=i;
}
for (rr int i=1;i<=rt[0];++i) dfs1(rt[i],0);
for (rr int i=1;i<=n;++i) Hs[i]=hs[i],hs[i]=0;
for (rr int i=1;i<=n;++i)
for (rr int j=Hs[i],t;j;j=t){
t=E[j].next;
if (F[j]) E[j]=(node){E[j].y,hs[F[j]]},hs[F[j]]=j;
}
for (rr int i=1;i<=rt[0];++i)
dp[rt[i]]=st,st+=d[rt[i]],dfs2(rt[i],0);
for (rr int i=1;i<=Q;++i) print(ans[i]),putchar(32);
return 0;
}
#长链剖分#CF208E Blood Cousins的更多相关文章
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分
传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点 ...
- BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)
题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...
- 2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)
传送门 题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi∑ai的最大值. 思路:一眼要01分数规划, ...
- 【BZOJ3522】【BZOJ4543】【POI2014】Hotel 树形DP 长链剖分 启发式合并
题目大意 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) \(1\leq n\leq 1 ...
- 【Vijos】lxhgww的奇思妙想(长链剖分)
题面 给定一棵树,每次询问一个点的\(k\)次祖先,强制在线. Vijos 题解 长链剖分. 链接暂时咕咕咕了. 现在可以戳链接看题解了 #include<iostream> #inclu ...
- 【BZOJ4543】Hotel加强版(长链剖分)
[BZOJ4543]Hotel加强版(长链剖分) 题面 BZOJ,没有题面 洛谷,只是普通版本 题解 原来我们的\(O(n^2)\)做法是设\(f[i][j]\)表示以\(i\)为根的子树中,距离\( ...
- 【BZOJ3653】谈笑风生(长链剖分)
[BZOJ3653]谈笑风生(长链剖分) 题面 BZOJ 洛谷 权限题啊.... 题解 首先根据题目给的条件,发现\(a,b\)都要是\(c\)的父亲. 所以这三个点是树上的一条深度单增的链. 因为\ ...
- 【CF1009F】Dominant Indices(长链剖分)
[CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的 ...
- 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)
[COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σa ...
随机推荐
- 学习go语言编程之错误处理
error接口 Golang中有一个关于错误处理的标准模式,即:error接口. type error interface { Error() string } 对于大多数函数,如果要返回错误,大致上 ...
- 单继承,多继承,菱形继承---day21
1.单继承 # ### 继承:一个类除了自身所有用的属性方法之外,还获取了另外一个类的成员属性和方法 ''' 一个类继承另外一个类,那么该类就是子类(衍生类),被继承的这个类就叫做父类(基类,超类) ...
- django学习第三天---django模板渲染,过滤器,反向循环 reversed,自定义标签和过滤器,模板继承
django模板渲染 模板渲染,模板指的就是html文件,渲染指的就是字符串替换,将模板中的特殊符号替换成相关数据 基本语法 {{ 变量 }} {% 逻辑 %} 变量使用 示例 Views.py文件 ...
- day04---系统重要文件
系统重要的文件 /etc的重要文件 1./etc/sysconfig/network-scripts/ifcfg-eth0 [root@localhost ~]# cat /etc/sysconfig ...
- Swift高级进阶-Swift编译过程,”SIL代码“,“IR语法”
swift编译过程 如果不懂LLVM,Clang的同学可以去了解下它的知识点 一些文章中有详细介绍 OC 的编译过程 ,本文来探索一下 Swift 的编译过程.Swift 的编译过程中使用 Swif ...
- 图数据库 NebulaGraph 的 Java 数据解析实践与指导
如何快速.即时.符合直觉地去处理 Nebula Java Client 中的数据解析?读这一篇就够了. 图数据库 NebulaGrpah 的论坛和微信群里,有不少用户问及了 Java 客户端数据解析的 ...
- 13 种在 JavaScript 中删除/过滤数组的方法【转】
英文 | https://javascript.plainenglish.io/13-methods-to-remove-filter-an-item-in-an-array-and-array-of ...
- coding 的pages 静态要六分钱一个月,我也是醉了。
前言 前几天,收到个短信,说coding 竟然免费开放 动态pages,我这心说 NB啊,这咱得蹭上一波热度. github 总是打不开 gitee 每次pages都要手动点下发布,而且是静态的. c ...
- Windows改变终端字体后,终端一片黑 的解决办法
使用Windows终端的时候总觉得字体不好看,于是乎按照网上的教程改了一下 注册表 计算机\HKEY_CURRENT_USER\Console%SystemRoot%_system32_cmd.exe ...
- Github下载release附件变相提速方法
最近找到了个油猴插件,下载2M/s,推荐大家使用Github 镜像访问,加速下载 描述 github上面有许多开源的软件,作者们都打包发布为release版本,我们可以下载打包好的软件,但是,由于国内 ...