贪心+dfs,CF 1975D - Paint the Tree

news2024/10/12 19:12:28

目录

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

1975D - Paint the Tree


二、解题报告

1、思路分析

我们从树中一点出发,遍历整颗树最后回到这个点的最小步数:2n - 2,即边数*2

不要求回到该点:2n-2 - maxd,maxd 为 从该点出发到达叶子的最远步数

PA要遍历整棵树,PB也要遍历整棵树

最佳的情况就是 PA PB 重合或相邻,PA按照最优情况遍历整棵树,PB跟着PA跑

但是 PA 和 PB 不重合或者相邻又该如何?

一个比较稳健的方式是:换根dp

怎么考虑呢?二者一定是在某个点相遇,然后PB按照最优方式遍历这棵树

那么对于一个相遇节点u,答案为 dis(a, u) + dis(u, b) + 2n-2 - maxd(u)

dis(a, u) 我们可以树剖,maxd(u)我们可以换根dp,是可行的,然后可能要注意一下因为A先走B后走,dis(a, u) 和 dis(u, b) 我们注意一下corner case

不过我们注意到,最终答案的形式为:2n - 2 - maxd(u) + dis,这里的dis是二者在u相遇所需步数

我们考虑一开始 a 和 b 相向而行,那么 u 就是路径<a, b>中点mid,事实上以mid为相遇点就是最优解

为什么?

从mid开始往外枚举其它的u,maxd(u) 每次最多增加1,而dis 也会增加至少1,也就是说 最后的值单调不降,因而mid就是最优解

那么我们两次dfs就可以了

2、复杂度

时间复杂度: O(N)空间复杂度:O(N)

3、代码详解

 ​
#include <bits/stdc++.h>

// #define DEBUG

using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;

void solve() {
    int n, a, b;
    std::cin >> n >> a >> b;
    -- a, -- b;
    std::vector<std::vector<int>> adj(n);
    for (int i = 1; i < n; ++ i) {
        int u, v;
        std::cin >> u >> v;
        -- u, -- v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    std::vector<int> dis(n);

    std::vector<int> path;
    int mid = -1, d = 0;

    auto dfs0 = [&](auto &&self, int u, int p) -> void{
        path.push_back(u);
        if (u == b) {
            mid = path[(path.size() + 1) / 2 - 1];
            d = path.size();
        }
        for (int v : adj[u])
            if (v != p) {
                self(self, v, u);
            }
        path.pop_back();
    };

    auto dfs1 = [&](auto &&self, int u, int p) -> void{
        for (int v : adj[u])
            if (v != p) {
                dis[v] = dis[u] + 1;
                self(self, v, u);
            }
    };

    if (a == b) {
        dfs1(dfs1, a, -1);
        std::cout << 2 * n - 2 - *std::max_element(dis.begin(), dis.end()) << '\n';
        return;
    }

    dfs0(dfs0, a, -1);
    dfs1(dfs1, mid, -1);

    std::cout << 2 * n - 2 - *std::max_element(dis.begin(), dis.end()) + d / 2 << '\n';
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

#ifdef DEBUG
    int cur = clock();
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif

    int t = 1;
    std::cin >> t;

    while (t--) {
        solve();
    }
#ifdef DEBUG
    std::cerr << "run-time: " << clock() - cur << '\n';
#endif
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

汽车免拆诊断案例 | 2013款宝马116i车偶尔加速不良

故障现象  一辆2013款宝马116i车&#xff0c;搭载N13B16A 发动机&#xff0c;累计行驶里程约为12.1万km。车主反映&#xff0c;该车行驶中偶尔加速无反应&#xff0c;且发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;故障现象无法再现。用故障检测仪检测&#xff…

[论文阅读] MoAI: Mixture of All Intelligence for Large Language and Vision Models

原文链接&#xff1a;http://arxiv.org/abs/2403.07508 源码链接&#xff1a;https://github.com/ByungKwanLee/MoAI 启发&#xff1a;这篇文章提供一个比较新奇的思路&#xff0c;将传统CV小模型的输出进行语言化&#xff0c;转换成统一格式&#xff0c;传入到后续的模型中&…

8. Control Station Studio控制站开发平台概述

更多内容见CSDN博客专栏&#xff1a;无人机飞控 相关资源&#xff1a;https://gitee.com/ss15/ph47 8.1. 概述 Ground Control Station&#xff08;CSS&#xff09;是一个地面站软件开发平台&#xff0c;通过对控制站工程的设计搭建&#xff0c;从而开发出面向各种不同用途&a…

【软件测试】基本知识2

一、能对穷举场景设计测试点——等价类划分法 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分 分类 有效等价类&#xff1a;满足需求的数据集合无效等价类&#xff1a;不满足需求的数据集合 步骤 明确需求确定有效和无效等价类提取数据编写…

linux使用xhell连接特别慢

linux使用xhell连接特别慢 在此记录一下 1.vi /etc/ssh/sshd_config&#xff0c;修改如下配置 GSSAPIAuthentication yes 修改 no UseDNS yes 修改 no 2.重新启动sshd服务 systemctl restart sshd

从混乱到卓越:六西格玛是如何助力企业摆脱困境的

六西格玛&#xff0c;这一源自摩托罗拉、发扬于通用电气的管理方法&#xff0c;以其严谨的数据分析、持续改进的理念&#xff0c;成为了企业转型升级的利器。它不仅仅是一套工具和方法论&#xff0c;更是一种追求卓越的文化和思维方式。在六西格玛的视角下&#xff0c;企业的一…

基于yolov8、yolov5的鸟类检测系统(含UI界面、数据集、训练好的模型、Python代码)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…

当下流行的【疗愈】是什么?疗愈门店未来发展前景分析|个案疗愈系统源码私

▶ 「疗愈」是什么&#xff1f; 疗愈通常指的是一种综合性的治疗方法&#xff0c;旨在帮助人们恢复身心健康、平衡和内在和谐。可能包括心理治疗、身体疗法、能量疗法、草药疗法、冥想和其他练习&#xff0c;以促进个体的整体健康和福祉。 疗愈的具体内容和方法会因不同的文化…

论文笔记:Pre-training to Match for Unified Low-shot Relation Extraction

论文来源&#xff1a;ACL 2022 论文地址&#xff1a;https://aclanthology.org/2022.acl-long.397.pdf 论文代码&#xff1a;https://github.com/fc-liu/MCMN &#xff08;笔记不易&#xff0c;请勿恶意转载抄袭&#xff01;&#xff01;&#xff01;&#xff09; 目录 A…

IDEA下面的Services不见了(解决方案)

大家使用IDEA有时候新打开个项目这个东西不会自动出现如何解决 配置方法&#xff1a; 右上角打开进入Edit Configurations 进入后我们看到里面是没有SpringBoot相关内容的 点击加号选择SpringBoot 然后Apply Ok即可&#xff0c;现在IDEA下面就会出现Service了&#xff0c;打…

海外盲盒系统开发,开拓海外盲盒市场

近几年&#xff0c;盲盒出海成为热潮&#xff0c;吸引着众多企业转向海外布局&#xff01;国内盲盒市场逐渐饱和&#xff0c;反而海外市场存在着巨大的商机&#xff0c;这促使着各大企业开始向海外发展。这几年中&#xff0c;海外盲盒市场也创造出了越来越多的惊喜&#xff0c;…

Cesium 贴地圆 并显示外轮廓线 outline

老规矩&#xff1a;直接放效果图&#xff0c;符合就往下看&#xff0c;不符合出门右转。 cesium官方暂时未提供贴地的圆&#xff0c;添加外轮廓线。 思路能不能写glsl更改材质&#xff0c;让图形显示外轮廓线。设置一个阈值距离圆心距离定值内显示一种颜色&#xff0c;超过这个…

JQuery基本操作(二)

遍历 $(选择器).each(function(下标,值){//代码块 });$.each(数组名,function(下标,值){//代码块 }); <body><button> 获得数组下标和值</button> </body> <script>$(function(){$("button").click(function(){var arr [1,2,3,4,5,…

PN8036非隔离DIP7直插12V500MA开关电源芯片

PN8036宽输出范围非隔离交直流转换芯片 &#xff0c;集成PFM控制器及650V高雪崩能力智能功率MOSFET&#xff0c;用于外围元器件极精简的小功率非隔离开关电源。PN8036内置650V高压启动模块&#xff0c;实现系统快速启动、超低待机功能。该芯片提供了完整的智能化保护功能&#…

软考《信息系统运行管理员》- 5.2 信息系统数据资源例行管理

5.2 信息系统数据资源例行管理 文章目录 5.2 信息系统数据资源例行管理数据资源例行管理计划数据资源载体的管理存储介质借用管理存储介质转储管理存储介质销毁管理 数据库例行维护健康检查数据库日志检查数据库一致性检查 数据库监测管理数据库备份与恢复数据库备份与恢复数据…

【Qt】详细Qt基础 (包括自定义控件)

目录 QT 概述创建项目项目文件&#xff08;. pro&#xff09;main.cppmainwindow.uimainwindow.hmainwindow.cpp 窗口类QWidget 窗口显示QDialog 窗口 QPushButton创建显示 对象树基本概念功能 坐标体系控件Item WidgetsQListWidgetQTreeWidgetQTableWidget 自定义控件 QT 概述…

Java_EE 多线程技术(Thread)--2

线程同步的使用使用this作为线程对象锁 某一个同步块需要同时拥有“两个以上对象的锁”时&#xff0c;就可能会发生“死锁”的问题。比如&#xff0c;“化妆线程”需要同时拥有“镜子对象”、“口红对象”才能运行同步块。那么&#xff0c;实际运行时&#xff0c;“小丫的化妆线…

解锁健康低卡的沙拉汁,享受清爽美味!

文章目录 蜂蜜芥末沙拉汁香草酸奶沙拉汁香草酸奶沙拉红酒醋黄芥末汁油醋沙拉汁百香果沙拉汁柠檬油醋汁蜂蜜芥末沙拉汁 往密封罐里,加入芥末酱、蜂蜜、苹果醋和胡椒,然后秘诀来了:用力摇10秒让油汁充分融合乳化,可以增添这款沙拉酱浓醇的厚度和风味。 香草酸奶沙拉汁 先将…

pytest + yaml 框架 - 支持pytest-repeat插件重复执行用例

平常在做功能测试的时候&#xff0c;经常会遇到某个模块不稳定&#xff0c;偶然会出现一些bug&#xff0c;对于这种问题我们会针对此用例反复执行多次&#xff0c;最终复现出问题来。 自动化运行用例时候&#xff0c;也会出现偶然的bug&#xff0c;可以针对单个用例&#xff0…