\(\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. Centos 6.8安装配置KVM

    一.开启cpu虚拟化 首先开启CPU虚拟化支持,通过BIOS设置.之后输入 [root@hostname ~]#egrep '(vmx|svm)' /prov/cpuinfo 如果有输出内容,代表cp ...

  2. GORM学习指南

    orm是一个使用Go语言编写的ORM框架.它文档齐全,对开发者友好,支持主流数据库. 一.初识Gorm Github GORM 中文官方网站内含十分齐全的中文文档,有了它你甚至不需要再继续向下阅读本文 ...

  3. 《Flink SQL任务自动生成与提交》后续:修改flink源码实现kafka connector BatchMode

    目录 问题 思路 kafka参数问题 支持batchmode的问题 参数提交至kafkasource的问题 group by支持问题 实现 编译 测试 因为在一篇博文上看到介绍"汽车之家介绍 ...

  4. 【Java】获取两个字符串中最大相同子串

    题目 获取两个字符串中最大相同子串 前提 两个字符串中只有一个最大相同子串 解决方案 public class StringDemo { public static void main(String[ ...

  5. func-spring-boot-starter 快速上手

    func-spring-boot-starter test 项目地址 func-spring-boot-starter项目地址: https://gitee.com/yiur/func-spring- ...

  6. 1010day-人口普查系统

    1.xiugai.java package com.edu.ia; import java.io.IOException;import java.sql.SQLException; import ja ...

  7. MySQL之MVCC与幻读

    转自 https://blog.csdn.net/qq_31930499/article/details/110393988 如果是快照度,直接采用MVCC,如果是当前读,才会走next-key lo ...

  8. Java 面试题史上最强整理

    https://mp.weixin.qq.com/s/kJpRgfI3zT77XqMeRfmmQQ

  9. Oracle AWR报告采样分析

    DB time可以用来判断数据库整体是否繁忙,如果Elapsed*CPU个数小于DB time,代表数据库整体比较繁忙,CPU负载会比较高. Report Summary分为8个部分,最主要的是loa ...

  10. K8S配置多集群访问

    中文官档: http://docs.kubernetes.org.cn/823.html 背景:我们通过会有多个k8s集群,例如集群(cn-k8s)和集群(jp-k8s),那个就需要有一台服务器可以同 ...