题目

有一棵 \(n\) 个结点的树,按顺序给出树边 \((fa[i],i)\),

\(Q\) 次询问查询如果只选取第 \([l,r]\) 条树边,问森林的直径

\(fa[i]\) 的生成方式为 \(fa[i]=rand()\bmod{i-1}+1\)

\(n,Q\leq 5*10^5\)


分析

先不考虑树的具体形态,就求直径而言,答案会存放在父节点,

由于边的顺序是按子节点升序排列,那么固定左端点 \(l\),根节点只会增加不会减少,

按照 \(l\) 降序排序,就要令 \(r\) 尽量小,设 \(f[x][d]\) 表示以 \(x\) 为根的子树内到一点距离 \(d\) 时 \(r\) 的最小值,

\(dp[d]\) 表示两点直径为 \(d\) 时 \(r\) 的最小值,就先用 \(f[x]\) 和 \(f[y]\) 更新 \(dp\),再更新 \(f[x]\)。

时间复杂度取决于直径的长度,即 \(O(qd^2)\)

从没有想到这种 \(fa[i]\) 的生成会令树高期望为 \(O(\log{n})\),那么时间复杂度为 \(O(q\log^2{n})\),两个 \(\log\) 两秒肯定跑得完。

大概证明一下,设 \(dp[i]\) 表示第 \(i\) 个点的期望深度 \(dp[1]=0\),那么 \(dp[i]=\frac{1}{i-1}\sum_{j=1}^{i-1}dp[j]+1\Rightarrow (i-1)dp[i]=S[i-1]+(i-1)\)

那么 \(dp[i-1]=\frac{1}{i-2}\sum_{j=1}^{i-2}dp[j]+1\Rightarrow (i-2)dp[i-1]=S[i-2]+(i-2)\)

两式相减就可以得到 \(dp[i]=dp[i-1]+\frac{1}{i-1}\),因为 \(\sum_{i=1}^n\frac{1}{i}\) 趋近于 \(\log\),

所以期望高度就是 \(\log{n}\),但实际上高度在两倍左右


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=500011,mx=40; struct rec{int l,r;}q[N];
int dp[81],f[N][41],n,m,fa[N]; long long ans;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
bool cmp(rec x,rec y){
if (x.l!=y.l) return x.l>y.l;
else return x.r>y.r;
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
void update(int x,int y){
for (int i=0;i<=mx;++i) if (f[x][i]<=n)
for (int j=0;j<=mx;++j)
dp[i+j+1]=min(dp[i+j+1],max(max(f[x][i],f[y][j]),y));
for (int i=0;i<mx;++i) if (f[y][i]<=n)
f[x][i+1]=min(f[x][i+1],max(f[y][i],y));
}
int main(){
n=iut(),memset(f,0x3f,sizeof(f));
memset(dp,0x3f,sizeof(dp)),dp[0]=0;
for (int i=1;i<=n;++i) f[i][0]=0;
for (int i=2;i<=n;++i) fa[i]=iut(),iut();
for (int Q=iut();Q;--Q){
int l=iut()+1,r=iut()+1;
if (l==n+1) continue;
if (r==n+1) --r;
q[++m]=(rec){l,r};
}
sort(q+1,q+1+m,cmp);
for (int l=1,r,j=n;l<=m;l=r+1){
for (r=l;r<=m&&q[r].l==q[l].l;++r); --r;
for (;j>1&&q[l].l<=j;--j) update(fa[j],j);
for (int i=l,j=mx*2;i<=r;++i){
while (dp[j]>q[i].r) --j;
ans+=j;
}
}
return !printf("%lld",ans);
}

#期望,树的直径#51nod 1803 森林直径的更多相关文章

  1. BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP

    题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...

  2. 【bzoj3451】Tyvj1953 Normal 期望+树的点分治+FFT

    题目描述 给你一棵 $n$ 个点的树,对这棵树进行随机点分治,每次随机一个点作为分治中心.定义消耗时间为每层分治的子树大小之和,求消耗时间的期望. 输入 第一行一个整数n,表示树的大小接下来n-1行每 ...

  3. 51nod1803 森林直径

    [传送门] 考虑计算直径的 dp 方法. $d[u]$ 表示以 $u$ 为根的子树能 $u$ 能走到的最远距离 $dp[u]$ 表示以 $u$ 为根的子树的直径那么每次dfs一个子节点后$dp[u] ...

  4. 2018牛客网暑期ACM多校训练营(第五场) F - take - [数学期望][树状数组]

    题目链接:https://www.nowcoder.com/acm/contest/143/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  5. BZOJ4481: [Jsoi2015]非诚勿扰【概率期望+树状数组】

    Description [故事背景] JYY赶上了互联网创业的大潮,为非常勿扰开发了最新的手机App实现单身 大龄青年之间的"速配".然而随着用户数量的增长,JYY发现现有速配的算 ...

  6. 牛客网暑期ACM多校训练营(第五场) F - take —— 期望+树状数组+逆元

    看到一篇好的博客特意转出来观摩大佬:转:https://blog.csdn.net/greybtfly/article/details/81413526 题目大意:给n个箱子排成一排,从头到尾按顺序依 ...

  7. BZOJ4481 JSOI2015非诚勿扰(概率期望+树状数组)

    首先求出每个女性接受某个男性的概率.这个概率显然是一个无穷等比数列求和. 然后按编号从小到大考虑每个女性,维护出每个男性被选择的期望次数,BIT上查询后缀和即可. 需要long double. #in ...

  8. BZOJ3244 [Noi2013]树的计数 【数学期望 + 树遍历】

    题目链接 BZOJ3244 题解 不会做orz 我们要挖掘出\(bfs\)序和\(dfs\)序的性质 ①容易知道\(bfs\)序一定是一层一层的,如果我们能确定在\(bfs\)序中各层的断点,就能确定 ...

  9. bzoj 4481: [Jsoi2015]非诚勿扰【期望+树状数组】

    首先很容易计算对于一个如意郎君列表里有x个男性的女性,编号排第i位的男性被选的概率是 \[ p*(1-p)^{i-1}+p*(1-p)^{i-1+n}+p*(1-p)^{i-1+n}+- \] \[ ...

  10. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

随机推荐

  1. lib,dll的位置

    在添加第三方库的时候需要注意放置的路径,注意区分x86和x64的文件夹路径以及VS的版本,不要放错了 lib的位置:(需要先将lib放到该路径下,不然会说找不到.lib)C:\Program File ...

  2. golang常用库:gorilla/mux-http路由库使用

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库/管理工具-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:gola ...

  3. 正则表达式re模块---day18

    1.匹配单个字符 import re lst = re.findall(正则表达式,要匹配的字符串) 返回的是列表,按照正则表达式匹配到的内容都扔到列表中 # ### 1.预定义字符集 # \d 匹配 ...

  4. itertools.chain.from_iterable()将嵌套列表合并成一个

    from itertools import chain a = [[1,2],[3,4]] print(chain.from_iterable(a)) # [1,2,3,4]

  5. Anaconda下载安装步骤

    下载地址 下载比较慢的,用迅雷下,点击复制地址,然后在迅雷里面直接创建连接 Anaconda基于python3.8 Anaconda基于python3.6的 安装步骤 没啥说的,一路安装,中间有个勾选 ...

  6. 第120篇: DOM编程(常用操作、动态脚本、样式及动态表格)

    好家伙,我回来了, 本篇为<JS高级程序设计>第十四章"DOM编程"学习笔记   1.DOM编程 我们知道DOM是HTML文档的编程接口, 我们可以通过HTML代码实现 ...

  7. 【Azure 微服务】Service Fabric 部署时遇见了VMExtensionProvisioningError错误: Multiple VM extensions failed to be provisioned on the VM

    问题描述 Deployment  Azure Service Fabric 时,遇见了VMExtensionProvisioningError, 全文如下: Deployment Name: 385A ...

  8. opencv库图像基础4绘图-python

    opencv库图像基础4绘图-python 1.绘画线条和简单图形 创建颜色字典和一个画布 import cv2 import numpy as np import matplotlib.pyplot ...

  9. 仅需10秒!ChatGPT轻松画出UML用例图,我却苦战10分钟。

    当我们写技术文档时,一张系统用例图,平时要花费10分钟才完成,而ChatGPT绘图过程只用了10秒钟,基本可以达到同样的水平,通过ChatGPT可以显著提高画流程图的效率. 什么是用例图 用例图是统一 ...

  10. 新零售SaaS架构:什么是线上商城系统?

    零售商家为什么要建设线上商城 传统的实体门店服务范围有限,只能吸引周边500米内的消费者.因此,如何拓展服务范围,吸引更多消费者到店,成为了店家迫切需要解决的问题. 缺乏忠实顾客,客户基础不稳,往往是 ...