题目

有一棵 \(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. win32--GetFileAttributes

    DWORD d = GetFileAttributes(path.c_str()); 根据返回的十进制,对比文件属性,来检索指定文件或目录的文件系统属性. 也可以使用 if ((d & FIL ...

  2. mysql日期范围查找(两个日期之间的记录)

    转自:https://blog.csdn.net/lzxlfly/article/details/97577575?utm_medium=distribute.pc_relevant_t0.none- ...

  3. Kotlin 协程二 —— 通道 Channel

    目录 一. Channel 基本使用 1.1 Channel 的概念 1.2 Channel 的简单使用 1.3 Channel 的迭代 1.4 close 关闭 Channel 1.5 Channe ...

  4. 【NLP学习其3.5】词嵌入的特性,为什么词之间会有联系?

    词嵌入的特性 现在你有了一堆嵌入向量,我们可以开始学习他们之间的特性了 前情提要:https://www.cnblogs.com/DAYceng/p/14962528.html 先把各向量重新命名便于 ...

  5. 【Azure Redis 缓存】Redis的监控方式? 是否有API接口调用来获取监控值

    问题描述 对于PaaS的Azure Cache for Redis,Azure中有哪些监控方式?是否能有api接口调用来获取监控值? 问题答案 1) 在Redis的门户中,使用Metrics查看Red ...

  6. 2024年,提升Windows开发和使用体验实践 - 终端&命令行篇

    前言 经过前面的铺垫,终于继续更新了,这个大概率是本系列近期的最后一篇了. 同时之前有些内容更新,我也补充到这一篇里面. 关于 scoop 管理器的补充 scoop 常用命令 scoop help # ...

  7. MySql变量说明

    1 #变量 2 /* 3 系统变量: 4 全局变量 5 会话变量 6 7 自定义变量: 8 用户变量 9 局部变量 10 11 */ 12 #一.系统变量 13 /* 14 说明:变量由系统定义,不是 ...

  8. 获取input[type="checkbox"]:checked 所在tr中特定元素

    1.要求如下  2.html源码 <div class="btn"> <button type="button" onclick=" ...

  9. Set-Alias navi ./navi.bat - 设置别名 - powershell入门 (后期改方案了,换npm script)

    需求 开机要启动好几个服务,原先都用vscode启动,觉得可能比较占内存,所以改成命令行 发现直接运行bat,需要输入./batName.bat 一次还行,天天输入就麻烦了 命令 Set-Alias ...

  10. 如何在forEach内使用异步调用 async/await

    翻自: How to use async and await in a forEach JS loop? https://learn.coderslang.com/0144-how-to-use-as ...