\(\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. 由浅入深学习Apache httpd原理与配置

    一.apache简介: Apache HTTPD又可以简称为httpd或者Apache,它是Internet使用最广泛的web服务器之一,使用Apache提供的web服务器是由守护进程httpd,通过 ...

  2. MySQL索引失效之隐式转换

    常见索引失效: 1. 条件索引字段"不干净":函数操作.运算操作 2. 隐式类型转换:字符串转数值:其他类型转换 3. 隐式字符编码转换:按字符编码数据长度大的方向转换,避免数据截 ...

  3. Word2010邮件合并制作成绩单

    原文链接: https://www.toutiao.com/i6488941003494392333/ 准备数据源: 选择"邮件"选项卡,"开始邮件合并"功能组 ...

  4. 【Spring专场】「AOP容器」不看源码就带你认识核心流程以及运作原理

    前提回顾 前一篇文章主要介绍了spring核心特性机制的IOC容器机制和核心运作原理,接下来我们去介绍另外一个较为核心的功能,那就是AOP容器机制,主要负责承接前一篇代理模式机制中动态代理:JDKPr ...

  5. sql多行合并一列

    with a as( select * from( select 1 userId , '天津' province union select 1 userId , '北京' union select ...

  6. BarTender调用示例

    安装BarTender 软件后,会注册一个COM 然后在项目中添加BarTender COM 引用 BarTender模板中的条码右键属性-数据源类型-嵌入的数据-名称(比如设置为 barcode p ...

  7. Android学习笔记2

    4,用intent在activity之间传递数据(两个Activity可能不是在一个应用程序中) (1),从MainActivity向HelloActivity传递参数123 package com. ...

  8. vue-cli创建的项目打包成app引入字体图标的问题

    将项目在手机端调试时,发现引入的阿里图标显示不出来,需要在引入的iconfont.css文件夹里给url加上https

  9. 44.Prim算法

    public static void main(String[] args) { //测试看看图是否创建ok char[] data = new char[]{'A','B','C','D','E', ...

  10. centos7 service iptables save 报错

    解决办法: 1.systemctl stop firewalld 2.yum install iptables-services 3.systemctl  restart iptables 4.ser ...