树网的和 题解

先放一张图在这里插入图片描述

作为一道蓝题,其实快接近紫题了。

--------------------------------------不怎么华丽的分割线--------------------------------------
前置芝士:树的直径
一个点的最远点( y y y)到这个最远点的最远点( p p p)一定是一条树的直径。

假若说我们已知 y y y是一个端点,那很简单,一定是

所以只用考虑 y y y的位置

如果 y y y不在直径上,那么根据树的直径的定义,一定有一个直径端点更远!

具体不细讲了,证明有点烦,但脑补却挺容易的
--------------------------------------不怎么华丽的分割线--------------------------------------
遇到这种题,先别慌 ,待会儿有的是时间慌呢 ,先把条件拿走,然后发现,如果去掉 s s s,这不就是树的直径吗?

然后我们感性猜测一下,答案应该是树的直径上的一条链吧?

如果是IOI,那你就直接试一试,OI则最好证明一下

考虑反证法

如果说不是树的直径上的一条链,则必定这条链与树的直径的点有交集(不然到树的直径的两端就太远了)

那么,就考虑是X形还是Y形了(分一下,好想)

其实X差不多是两个Y相加

那么就考虑Y了

在这里插入图片描述

如图,红线是目前的选法,绿线是在直径上的最佳选法

那么,可以发现,虽然绿线到达枝干(我们称直径以外为枝干,直径为主干)的末端更远,但是到达主干末端却更近 根据树的直径的定义,一定是从分叉点到达主干末端更远(起码不会更近)

故而红线的选择其实不影响答案——它只不过是把一个较小数变得更小了,我们要的是最大值!

证毕
--------------------------------------不怎么华丽的分割线--------------------------------------

题目到这里就十分简单了。首先,一定要考虑到直径两端的距离,然后是挂在链上的一堆枝干的最大值。考虑枚举链的左端点,采用双指针维护。链上枝干的最大值比较烦,我懒得想更快的单调队列,用了个RMQ维护

结束了……啊不,给个代码


#include <bits/stdc++.h>
const int N = 300000 + 10;
using namespace std;
int n, c, d[N];
vector<pair<int, int>> E[N];
int e1, e2;
int nxt[N], nxtt[N], a[N], k[N], cnt, s, on[N];
int big[N], dg[N];
void dfs(int u, int fa)
{
    for (auto vv : E[u]) {
        int v = vv.first, w = vv.second;
        if (v == fa)
            continue;
        d[v] = d[u] + w;
        if (d[v] > d[c])
            c = v;
        dfs(v, u);
    }
}
void dfss(int u, int fa)
{
    int cc = 0, cw = 0;
    d[u] = 0;
    for (auto vv : E[u]) {
        int v = vv.first, w = vv.second;
        if (v == fa)
            continue;
        dfss(v, u);
        if (d[v] + w > d[u])
            d[u] = d[v] + w, cc = v, cw = w;
    }
    nxt[u] = cc;
    nxtt[u] = cw;
}
void dffs(int u, int fa)
{
    for (auto vv : E[u]) {
        int v = vv.first, w = vv.second;
        if (v == fa || on[v])
            continue;
        d[v] = d[u] + w;
        if (d[v] > d[c])
            c = v;
        dfs(v, u);
    }
}
int mn[27][N], mx[27][N];
void init()
{
    for (int i = 1; i <= cnt; i++)
        mx[0][i] = big[i];
    for (int i = 1; i <= 26; i++)
        for (int j = 1; j + (1 << i) - 1 <= cnt; j++) {
            mn[i][j] = min(mn[i - 1][j], mn[i - 1][j + (1 << (i - 1))]);
            mx[i][j] = max(mx[i - 1][j], mx[i - 1][j + (1 << (i - 1))]);
        }
}
int gt_min(int x, int y)
{
    int t = log2(y - x + 1);
    return min(mn[t][x], mn[t][y - (1 << t) + 1]);
}
int gt_max(int x, int y)
{
    int t = log2(y - x + 1);
    return max(mx[t][x], mx[t][y - (1 << t) + 1]);
}
int main()
{
    cin >> n >> s;
    for (int i = 1; i < n; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        E[u].push_back({ v, w }), E[v].push_back({ u, w });
    }
    dfs(1, 0);
    d[c] = 0, e1 = c;
    dfs(c, 0);
    e2 = c;
    dfss(e1, 0);
    memset(d, 0, sizeof d);
    for (int i = e1; i != e2; i = nxt[i])
        a[++cnt] = i,
        on[i] = cnt,
        k[cnt + 1] = nxtt[i];
    for (int i = 1; i <= cnt + 1; i++)
        k[i] += k[i - 1];
    a[++cnt] = e2;
    on[e2] = cnt;
    for (int i = 1; i <= cnt; i++)
        dffs(a[i], 0), big[i] = d[c], c = 0;
    init();
    int ans = 0x3f3f3f3f;
    for (int l = 1, r = 1; l <= cnt; l++) {
        while (r <= cnt && k[r] - k[l] <= s)
            r++;
        --r;
        ans = min(ans, max(gt_max(l, r), max(k[cnt] - k[r], k[l])));
    }
    cout << ans;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/442856.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形,superTabControl标签字体大小不匹配

一、前言 superTabControl做的浏览器标签(cefsharp)在缩放比例(125%,150%时字体不协调) 物联网浏览器,定制浏览器,多媒体浏览器(支持H264)参考栏目文章即可 二、配置参数 app.manifest参数 dpiAware =true <application xmlns="urn:schemas-microsoft-c…

Python快速入门系列-1

Python快速入门系列 第一章: Python简介1.1 Python的历史与发展1.2 Python的优势与特点1.2.1 易学易用1.2.2 动态类型1.2.3 丰富的标准库与第三方库1.2.4 面向对象与函数式编程1.2.5 广泛应用领域 1.3 Python的应用领域 第一章: Python简介 1.1 Python的历史与发展 Python是一…

Vue+SpringBoot打造个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

python 蓝桥杯之并查集

文章目录 总述合并过程查找过程算法实战实战1 总述 并查集&#xff08;Disjoint-set Union&#xff0c;简称并查集&#xff09;是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题&#xff0c;通常涉及到以下两种操作&#xff1a; 合并&#xff08;Uni…

优化员工学习体验:企业内训APP的设计与开发方案详解

当下&#xff0c;设计并开发一款高效、便捷、个性化的企业内训APP已成为许多企业追求的目标。本文将探讨如何优化员工学习体验&#xff0c;以及企业内训APP的设计与开发方案。 一、了解员工需求 在设计和开发企业内训APP之前&#xff0c;首先需要深入了解员工的学习需求和偏好…

VSCode搭建ARM开发环境

为了构建Cortex M系列单片机免费开源的开发环境&#xff0c;网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式&#xff0c;下面记录环境搭建的流程。 我这边的PC环境为 WIN7专业版64bit。 需要用到的工具 Visual Studio CodeSTM32CubemxARM GCC 交叉编译工具链&#x…

“下个月AI觉醒,杀死奥特曼...”好莱坞上线首部AI制作的电影,长达90分钟,取材终结者2

下个月&#xff0c;愚人节&#xff0c;奥特曼危&#xff01; 美国当地时间3月6号&#xff0c;全球首部完全由AI制作的长篇电影《Our T2 Remake》在好莱坞举行首映礼&#xff0c;长达90分钟。 好家伙&#xff0c;“AI制作”&#xff0c;“90分钟”几个关键词一下子就吸引住了小…

安全先行,合规的内外网文件摆渡要重点关注什么?

内外网隔离在政府、军工部门、科研单位等已成为很常见的网络安全建设措施&#xff0c;内外网隔离是一种网络安全措施&#xff0c;用于保护内部网络免受外部网络的攻击和威胁。 内外网隔离的目的在于限制内外网之间的通信和数据交换&#xff0c;但网络隔离后&#xff0c;仍有数据…

CODESYS双通气缸功能块(ST源代码)

博途PLC双通气缸功能块请参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/136415539https://rxxw-control.blog.csdn.net/article/details/136415539CODESYS 结构变量使用 https://rxxw-control.blog.csdn.net/article/details/126248829

重塑语言智能未来:掌握Transformer,驱动AI与NLP创新实战

Transformer模型 Transformer是自然语言理解(Natural Language Understanding&#xff0c;NLU)的游戏规则改变者&#xff0c;NLU 是自然语言处理(Natural Language Processing&#xff0c;NLP)的一个子集。NLU已成为全球数字经济中AI 的支柱之一。 Transformer 模型标志着AI 新…

landsat遥感卫星地表温度LST计算教程

地表温度反演算法主要有以下三种&#xff1a;大气校正法&#xff08;也称为辐射传输方程&#xff1a;Radiative Transfer Equation——RTE&#xff09;、单通道算法和分裂窗算法。 大气校正法基本原理&#xff1a;首先估计大气对地表热辐射的影响, 然后把这部分大气影响从卫星传…

Android增量报告生成新方案

在开发精准测试覆盖率相关的功能时候&#xff0c;对于Android的增量报告&#xff0c;由于担心修改jacoco插件会影响App的打包&#xff0c;所以一直没有修改。在网上查了一下&#xff0c;没有找到合适的方案。只有一个diff-cover开源项目&#xff1a;https://github.com/abmaonl…

阿里云ECS u1服务器2核4G5M带宽优惠价199元/年性能测评

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

【编程实践】matlab中的转义字符

简记 这个报错是因为在sprintf函数中使用了无效的转义字符\U。在MATLAB中&#xff0c;转义字符\U是无效的&#xff0c;因此会导致警告。 检查sprintf函数中的格式化字符串是否包含了无效的转义字符。确保只使用MATLAB支持的转义字符。 如果想要输出一个反斜杠字符\&#xff0c…

简介:基于 OpenTiny 组件库的 rendereless 无渲染组件架构

在 HAE 自研阶段&#xff0c;我们实现的数据双向绑定、面向对象的 JS 库、配置式开发的注册表等特性&#xff0c;随着前端技术的高速发展现在已经失去存在的意义&#xff0c;但是在 AUI 阶段探索的新思路新架构&#xff0c;经过大量的业务落地验证&#xff0c;再次推动前端领域…

探索Web中的颜色选择:不同取色方法的实现

在Web开发中&#xff0c;提供用户选择颜色的功能是很常见的需求。无论是为了个性化UI主题&#xff0c;还是为了图像编辑工具&#xff0c;一个直观且易用的取色器都是必不可少的。本文将介绍几种在Web应用中实现取色功能的方法&#xff0c;从简单的HTML输入到利用现代API的高级技…

加密与安全_使用Java代码操作RSA算法生成的密钥对

文章目录 Pre概述什么是非对称加密算法&#xff1f;如何工作&#xff1f;示例&#xff1a;RSA算法特点和优势ECC&#xff1a;另一种非对称加密算法 Code生成公钥和私钥私钥加密私钥加密私钥解密 ( 行不通 )私钥加密公钥解密公钥加密和公钥解密 &#xff08;行不通&#xff09;保…

登录校验认证

会话技术 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪&#xff1a; 一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请…

【Python】进阶学习:__len__()方法的使用介绍

【Python】进阶学习&#xff1a;__len__()方法的使用介绍 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订…

Sftp服务器搭建(linux)

Sftp服务器搭建&#xff08;linux&#xff09; 一、基本工作原理 FTP的基本工作原理如下&#xff1a; 1&#xff09;建立连接&#xff1a;客户端与服务器之间通过TCP/IP建立连接。默认情况下&#xff0c;FTP使用端口号21作为控制连接的端口。​​​​​​​ 2&#xff09;身…