题目

有一棵 \(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 - ReadDirectoryChangesW的使用

    任务:创建一个进程,并在进程内创建一个文本,再创建另一个进程来监控第一个进程内的文本变化 //Process 1 #include <windows.h> #include <ios ...

  2. 学会了Java 8 Lambda表达式,简单而实用

    OneAPM 摘要:此篇文章主要介绍Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系OneAPM工程师编译整理. Java是一流的面向对象语言,除了 ...

  3. DataGear 制作联动异步加载图表的数据可视化看板

    通过DataGear的参数化数据集.图表事件处理和看板API功能,可以很方便地制作联动异步加载图表的数据可视化看板. 首先,新建一个参数化SQL数据集,如下所示: SELECT COL_NAME, - ...

  4. mongo重启、远程连接

    1.查看当前mongo启动进程 ps -ef | grep mongo 2.修改mongo启动远程连接配制文件 vi /etc/mongod.conf 将 bind_ip=127.0.0.1 这一行注 ...

  5. 【Azure Redis 缓存】Azure Cache for Redis 如何迁移

    Azure Cache for Redis 如何迁移 [Azure Redis 缓存]Azure Cache for Redis有默认备份可以用于恢复么?一文中,介绍了使用RDB文件的方式来迁移Red ...

  6. Nebula Graph 源码解读系列 | Vol.01 Nebula Graph Overview

    上篇序言中我们讲述了源码解读系列的由来,在 Nebula Graph Overview 篇中我们将带你了解下 Nebula Graph 的架构以及代码仓分布.代码结构和模块规划. 1. 架构 Nebu ...

  7. 16. Class字节码结构

    1. 相关概念 1.1字节码文件的跨平台性 Java 语言是跨平台的(write once, run anywhere) 当 Java 源代码成功编译成字节码后,如果想在不同的平台上面运行, 则无须再 ...

  8. apt-get upgrade 和apt-get dist-upgrade区别

    kali  linux系统或者 debian等系统 以及centos  在系统升级后经常会出现系统无法启动,或者启动之后GUI功能没有的问题: 笔记:   区别这两种用法 apt-get update ...

  9. Redis 常见数据类型(对象类型)和应用案列

    前言: 每次你在游戏中看到玩家排行榜,或者在音乐应用中浏览热门歌单,有没有想过这个排行榜是如何做到实时更新的?当然,依靠 Redis 即可做到. 在技术领域,我们经常听到「键值存储」 这个词.但在 R ...

  10. RGB、HSV、HSL和CMYK颜色空间

    目录 简介 RGB(红绿蓝)颜色空间 HSV(色调.饱和度.亮度)颜色空间 HSL(色调.饱和度.亮度)颜色空间 CMYK(青.品红.黄.黑)颜色空间 简介 这四种颜色空间在不同的应用领域有不同的用途 ...