\(\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. nuxt 相关

    https://github.com/xuqiang521/nuxt-ssr-demo https://www.cnblogs.com/laozhang-is-phi/p/10249248.html ...

  2. Python入门(上)

    Python入门(上) Python入门(上) 简介 Python 基础语法 行与缩进 注释 运算符 标准数据类型 变量 编程流程 顺序(略) 分支 if 循环 for while break 和 c ...

  3. css上下居中

    position: absolute; top: 20%; left: 50%; transform: translateX(-50%); -ms-transform: translateX(-50% ...

  4. STM32 EXTI(外部中断)

    一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...

  5. C# 给PDF文档设置过期时间

    我们可以给一些重要文档或者临时文件设置过期时间和过期信息提示来提醒读者或管理者文档的时效性,并及时对文档进行调整.更新等.下面,分享通过C#程序代码来给PDF文档设置过期时间的方法. 引入dll程序集 ...

  6. 问题记录——BigDecimal保留两位小数及格式化成百分比

    1.函数总结 BigDecimal.setScale()方法用于格式化小数点 setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOW ...

  7. 与Elasticsearch交互的客户端

    1.访问ES的方式 访问es的方式有两种,一种是http方式,还有一种是java客户端方式. 其中Java客户端又分为:1.1.Node client: 节点客户端实际上是一个集群中的节点(但不保存数 ...

  8. 学习鸟哥私房菜--linux bash 的环境变量ps1设置

    bash里边的变量ps1是用户平时的提示符,系统默认为[username@host 工作目录]$.关于ps1的相关介绍详见:http://www.cnblogs.com/starspace/archi ...

  9. FHQtreap(我有个绝妙的理解方法,但课的时间不够[doge])

    FHQtreap板子(P1486 [NOI2004] 郁闷的出纳员) 会了FHQ,treap什么的就忘了吧...... #include<bits/stdc++.h> using name ...

  10. HTTP-常用请求头

    HTTP-常用请求头 Accept:表示客户端可以接收的数据类型 Accpet-Language:表示客户端可以接收的语言类型 User-Agent:表示客户端浏览器的信息 Host:表示请求时的服务 ...