\(\mathcal{Description}\)

  Link.

  给一棵 \(n\) 个点的树,从某个点出发,遍历时必须走到已经走过的连通块所邻接的编号最小的结点。求从每个点出发,走到 \(1\) 号结点所需额外走的结点(即走到块的大小 \(-1\))。

  \(n\le2\times10^5\)。

\(\mathcal{Solution}\)

  把 \(1\) 提为根,那么一个点到根最大的阻碍就是路径上编号最大的结点。记 \(mx_u\) 表示 \(1\) 到 \(u\) 的最大结点编号,并令 \(R(u,l)\) 表示从 \(u\) 出发,向其子树,仅经过编号严格小于 \(l\) 的点能够到达的点的个数(\(u\) 一定产生贡献,所以至少为 \(1\)),DP 状态 \(f(u)\) 表示 \(u\) 的答案。

  现令 \(u\) 是 \(v\) 的父亲,考虑 \(u\) 对 \(v\) 的转移。

  • 若 \(mx_v=v\),显然 \(u\) 不会往 \(v\) 走,所以要加上 \(R(v,mx_u)\)。

  • 否则若 \(mx_u=u\),\(v\) 就会比 \(u\) 多在子树内卡一会儿。即 \(R(v,u)-[v<mx_{fa_u}]R(v,mx_{fa_u})\),后一项是减去重复的贡献。

  最后,加上 \(u\) 到 \(1\) 的贡献 \(f(u)\)。

  可以用暴搜加上记忆化直接计算 \(R(u,l)\)。考虑到搜索时会被子树内一些比 \(l\) 大的结点所拦截,那么被遍历的连通块就不满足需要计算 \(R\) 的转移限制。所以遍历到的总点数 \(\mathcal O(n)\)。故复杂度 \(\mathcal O(n)\)。

\(\mathcal{Code}\)

#include <map>
#include <cstdio> typedef std::pair<int, int> pii; const int MAXN = 2e5;
int n, ecnt, head[MAXN + 5], fa[MAXN + 5], mx[MAXN + 5], ans[MAXN + 5];
std::map<pii, int> rch; struct Edge { int to, nxt; } graph[MAXN * 2 + 5]; inline int max_ ( const int a, const int b ) { return a < b ? b : a; } inline void link ( const int s, const int t ) {
graph[++ ecnt] = { t, head[s] };
head[s] = ecnt;
} inline void init ( const int u ) {
mx[u] = max_ ( u, mx[fa[u]] );
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ( v = graph[i].to ) ^ fa[u] ) {
fa[v] = u, init ( v );
}
}
} inline int reach ( const int u, const int lim ) {
pii sta ( u, lim );
if ( rch.count ( sta ) ) return rch[sta];
int ret = 1;
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ( v = graph[i].to ) ^ fa[u] && v < lim ) {
ret += reach ( v, lim );
}
}
return rch[sta] = ret;
} inline void solve ( const int u ) {
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ( v = graph[i].to ) ^ fa[u] ) {
if ( mx[v] == v ) ans[v] = reach ( v, mx[u] );
else if ( mx[u] == u ) {
ans[v] = reach ( v, u ) - ( v > mx[fa[u]] ? 0 : reach ( v, mx[fa[u]] ) );
}
ans[v] += ans[u];
solve ( v );
}
}
} int main () {
scanf ( "%d", &n );
for ( int i = 1, u, v; i < n; ++ i ) {
scanf ( "%d %d", &u, &v );
link ( u, v ), link ( v, u );
}
init ( 1 );
solve ( 1 );
for ( int i = 2; i <= n; ++ i ) printf ( "%d%c", ans[i], i ^ n ? ' ' : '\n' );
return 0;
}

Solution -「AGC 029E」「AT 4504」Wandering TKHS的更多相关文章

  1. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  2. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  3. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  4. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  5. SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法

    用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...

  6. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  7. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  8. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  9. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

随机推荐

  1. vue中computed的作用以及用法

    在vue中computed是计算属性,主要作用是把数据存储到内存中,减少不必要的请求,还可以利用computed给子组件的data赋值. 参考地址:https://www.jianshu.com/p/ ...

  2. Go语言系列之标准库os

    os包提供了操作系统的系列函数,这些接口不依赖平台.设计为Unix风格的,错误处理是go风格的:调用失败会返回错误值而非错误码.通常错误值里包含更多信息. os包的接口在所有操作系统中都是一致的.非公 ...

  3. Amazon EKS 中 EFS 持久性存储

    作者:SRE运维博客 博客地址:https://www.cnsre.cn/ 文章地址:https://www.cnsre.cn/posts/220110850573/ 相关话题:https://www ...

  4. 【Java常用类】BigInteger

    BigInteger Integer类作为int的包装类,能存储的最大整型值为2^31-1,Long类也是有限的, 最大为2 ^63-1.如果要表示再大的整数,不管是基本数据类型还是他们的包装类 都无 ...

  5. 听不懂x86,arm?

    之前听别人讲x86或者ARM,我心里有一些疑惑,为什么他们不考虑32位还是64位的? 直到和师傅交流了一下: I:32位机是不是不支持部署k3os? T:这个年头哪里还有32位机? T:现在说x86, ...

  6. Solon Web 开发,七、视图模板与Mvc注解

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  7. pytest文档4-fixture之conftest.py

    用例1需要先登录,用例2不需要登录,用例3需要先登录.很显然这就无法用setup和teardown来实现了.fixture之conftest.py就是自定义测试用例的预置条件 1.firture相对于 ...

  8. 集合框架-工具类-JDK5.0特性-ForEach循环

    1 package cn.itcast.p4.news.demo; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 impo ...

  9. Android开发-页面布局

    首页布局 首页是ListView的布局 这个还需要制作ListView组件和适配器来显示数据. 关于页面 关于页面显示的是软件的基本信息和软件制作者的信息 这个就是采用基本的页面布局就行.

  10. 洛谷P1002过河卒java100分题解

    题目描述如图: 这道题我以前以回溯的方法做,只能拿到60分 现在才发现是道动态规划题 解题思路: 创建一个(0,0)到终点打小的二维数组表示棋盘 每个坐标的值为此位置到终点的路数 最下方一排和最右方一 ...