公西颖初 发表于 2025-6-4 19:35:04

P10789 [NOI2024] 登山

思路:

我们可以对于每个 \(i\) 找到它能跳到的最远的点和最近的点,倍增求一下 \(k\) 级祖先即可,令 \(\) 新表示 \(i\) 能跳到其祖先中深度在 \(\) 内的点;同时令 \(lim_i = d_i - h_i-1\) 表示 \(i\) 至少要跳到 \(lim_i\) 的深度。
考虑动态规划算法,令 \(dp_i\) 表示从 \(i\) 出发到山顶的合法登山序列个数。
那么相当于先从 \(i\) 滑落到 \(j\),然后再从 \(j\) 冲刺到 \(k\),再加上 \(dp_k\) 的方案数。
则状态转移方程为:

\) dp_k\]
其中 \(W(i,j)\) 表示 \(i \to j\) 路径上 \(lim_k\) 的最小值,因为每次冲刺到达的深度必须小于所有经过的点的 \(lim_k\)。
朴素实现是 \(O(N^3)\) 的,考虑优化;注意到 \(k\) 是 \(i\) 的祖先中一段深度连续的点,则我们可以做一个深度的 \(dp_i\) 的前缀和,差分即可,时间复杂度优化至 \(O(N^2)\),可以得到 25pts。
$O(N^2)$ Code: namespace Sub1{    ll L,R,x,a,b;    ll s,dp,dep;    void dfs1(ll u){      for(auto v:E){            if(v==fa)            continue;            dep=dep+1;            dfs1(v);      }    }    ll get(ll l,ll r){      if(!l)          return s;      return (s-s+mod)%mod;    }    void dfs3(ll u,ll Min,ll from){      L=l,R=min(r,Min);      if(L1;      build(k

尹疋 发表于 2025-11-11 20:25:37

新版吗?好像是停更了吧。

喳谍 发表于 2026-1-6 01:12:33

感谢分享,学习下。

埤兆 发表于 2026-1-16 06:54:51

感谢分享,下载保存了,貌似很强大

祝安芙 发表于 2026-1-18 02:05:47

收藏一下   不知道什么时候能用到

焦和玉 发表于 2026-1-19 07:49:45

分享、互助 让互联网精神温暖你我

甘子萱 发表于 2026-1-20 02:16:41

感谢分享,下载保存了,貌似很强大

莘度 发表于 2026-1-20 13:33:17

不错,里面软件多更新就更好了

喳谍 发表于 2026-1-24 01:32:10

懂技术并乐意极积无私分享的人越来越少。珍惜

电棘缣 发表于 2026-1-25 04:24:52

东西不错很实用谢谢分享

莘度 发表于 2026-1-27 07:41:33

用心讨论,共获提升!

诸婉丽 发表于 2026-1-30 05:22:52

这个好,看起来很实用

阎怀慕 发表于 2026-2-3 00:34:14

不错,里面软件多更新就更好了

坠矜 发表于 2026-2-6 07:47:28

这个好,看起来很实用

各卧唯 发表于 2026-2-6 08:30:46

这个有用。

卒挪 发表于 2026-2-7 03:35:26

yyds。多谢分享

乐敬 发表于 2026-2-8 08:42:55

新版吗?好像是停更了吧。

注思 发表于 2026-2-8 12:38:29

收藏一下   不知道什么时候能用到

喜及眩 发表于 2026-2-8 19:32:23

感谢分享,学习下。

敖可 发表于 2026-2-9 05:38:08

不错,里面软件多更新就更好了
页: [1] 2
查看完整版本: P10789 [NOI2024] 登山