P8314 [COCI2021-2022#4] Parkovi

news/2024/11/14 13:28:45/文章来源:https://www.cnblogs.com/purplevine/p/18543559

最大值最小是二分答案的特征。二分完后每个公园可以覆盖距离不超过 \(k\) 的领域,要覆盖整棵树。

二分完后需要 check。最可能的路线是贪心和 dp。

好像本质上都存储了可能成为答案的组合的部分信息,但贪心确定了这个组合当前的唯一性,dp 并没有,只能保证最优解一定属于被划分出来的某个等价类中,保留所有可能成为最优解的组合转移,用转移边进行答案的构造。

那么可以 dp 吗,对什么 dp 呢,转移边象征什么呢,怎么压缩信息呢。首先转移方向只能从儿子到自己,如果转移是在当前点建公园,需要记子树内最深的未被覆盖的点,至少是 \(O(siz)\) 的,并且合并子树时还要更新这个值,需要另外记最浅的公园,这就开不下了。

那一定是把大量本不可能成为答案的东西记进去了。找性质剪剪枝,或者直接发现答案构造可以被唯一确定变成贪心吧。

赛时发现对于一片叶子,覆盖它的公园并不是越浅越好,可能要稍微深一点照顾另一片叶子。尝试给叶子钦定一个顺序让决策有单调性,发现好像可以从下到上合并相交的必要放置区域,直到再往父亲放置就不合法了。 然后就感觉很不可做了。 所以还是去放置公园的点上贪吧。

赛时思路卡在这里了,试图思考覆盖每个点的公园在哪里。但 dp 视角,知道覆盖一个点的公园在哪里也不好推覆盖另一个点的公园在哪里,贪心视角,它没有单调性,要最小化的公园数量也不好借助覆盖每个点的公园表示。因此,要直接贪在不在这个点建公园。

这个时候就有单调性了。如果在这个点建了公园,则,尽量往上放一定更优,即,如果把公园改建到当前点的父亲,子树仍然合法,则改建一定不劣。

于是只要判定在父亲建公园是否会导致子树内有点不合法就可以了。维护每个子树内最深未覆盖点和最浅公园,先更新最浅公园,用这个值更新最深未覆盖点,就可以了。

首先一定要排除 dp,要记的东西有点多。其次要转到公园本身的视角,因为这样才好表示公园到底有几个。后面的过程是自然的。

#include <bits/stdc++.h>using LL = long long;int main() {int n, k; scanf("%d %d", &n, &k);std::vector<std::vector<std::pair<int, int>>> e(n);for (int i = 1, u, v, w; i < n; i++) {scanf("%d %d %d", &u, &v, &w), --u, --v;e[u].emplace_back(v, w), e[v].emplace_back(u, w);}auto chk = [&](LL x) {std::vector<LL> mn(n, 1e18), mx(n, -1e18);std::vector<int> p;std::function<void(int, int, int)> dfs = [&](int u, int fa, int l) {for (const auto &[v, w] : e[u]) if (v != fa) dfs(v, u, w), mn[u] = std::min(mn[u], mn[v] + w);if (mn[u] > x) mx[u] = std::max(mx[u], 0ll);for (const auto &[v, w] : e[u]) if (v != fa && mn[u] + mx[v] + w > x) mx[u] = std::max(mx[u], mx[v] + w);if (mx[u] + l > x || (u == 0 && mx[u] != -1e18))p.push_back(u), mn[u] = 0, mx[u] = -1e18;};return dfs(0, -1, 0), p;};LL l = 0, r = 1e15, ans = 0;while (l <= r) {LL mid = l + r >> 1;if (chk(mid).size() <= k) ans = mid, r = mid - 1;else l = mid + 1;}auto s = chk(ans);std::vector<int> vis(n);for (auto x : s) vis[x] = 1;for (int i = 0; i < n && s.size() < k; i++) if (!vis[i])s.push_back(i);printf("%d\n", ans);for (auto x : s) printf("%d ", x + 1);
} 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HyperWorks的shrink warp meshing

在HyperWorks中,针对某些具有复杂几何特征的零部件的网格剖分,Altair HyperMesh 向用户提供了一种名为 Shrink Warp Meshing 的技术,快捷高效地完成有限元模型前处理工作。例如在车辆碰撞分析研究中,用户可以使用 Shrink Warp Meshing 技术快速构建诸如传动系统等(具有复杂…

快速了解电源模块的使用方法 BDB10-12W系列电源模块

快速了解电源模块的使用方法 BDB10-12W系列电源模块电源是整个电路可靠工作的核心部分。然而,由于电源电路的电流和发热量较大,容易出现故障。今天我为大家介绍一下电源模块的使用方法。BOSHDIA电源模块是将电源电路集成到一个很小的PCB板上,从而实现输出稳定电压和大电流的…

GSDml结构

1. 如何方便的看到GSDml的结构在github上找到一个很好用的开源工具以及它的开源汉化,叫xml notepad,可以很好的看到设备树视图。 [2.9.0.8官方下载地址] [汉化插件]2. 文件结构总体就是header和Body两个部分ISO15745Profile | +--ProfileHeader +--ProfileBody|+--DeviceIdent…

什么是CRM系统?CRM系统在企业中扮演什么角色?

近年来,客户关系管理(CRM)系统逐渐显露头角,成为企业把握航向、驶向成功的关键。也有好多人来问关于这方面的问题,所以专门开一篇文章为大家深入了解CRM系统的含义、功能、价值以及它在现代企业中的实际应用,为的呀就是帮助大家全面把握这一概念。 一、CRM系统是什么? 客…

运行 MainApplication 时出错 运行 MainApplication 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行

运行springboot的启动类时,报了这个错。 解决办法: 1、修改选项2、添加缩短命令行项3、选择JAR清单

python 垃圾回收

引用计数器#define PyObject_HEAD PyObject ob_base; #define PyObject_VAR_HEAD PyVarObject ob_base;// 宏定义,包含 上一个、下一个,用于构造双向链表用。(放到refchain链表中时,要用到) #define _PyObject_HEAD_EXTRA \struct _object *_ob_next;标记清除 分…

作业4

作业①: 要求: 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist…

采集opc da 转 profinet IO项目案例

VFBOX协议转换网关支持PLC,modbus,EthernetIP,Profinet,CCLink,EtherCAT,IEC61850,IEC104,bacnet,DLT645,HJ212,opc ua,opc da,DNP3。目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 应用条件 2 4 查看OPC DA服务器的相关参数 2 5 配置网关采集opc da数据 4 6 用prof…

laravel PhpOffice 读取表格数据

/*** 更新安通船期* Description * Author Allen* Date 2024-11-11* @param Request $request [description]* @return [type] [description]*/public function updateAntongShipDate(Request $request){set_time_limit(0);$file = request()->file(file);if (em…

AI网关在企业系统应用中的角色和作用

在人工智能技术不断进步的今天,AI已成为推动全球经济增长的关键动力。预计到2027年,全球企业在AI技术上的支出将达到8000亿美元,年均增长率达到37.3%。这一趋势不仅改变了企业的业务模式,也对企业的安全策略提出了新的挑战,尤其是在构建、运行、扩展和保护AI应用程序及其底…

【python爬虫+情感分析】B站黑神话悟空热门弹幕情感分析及词云生成

黑神话悟空背景介绍 最近黑神话悟空这款游戏可谓红遍大江南北,不仅IGN给出了8分的高分,就连央视新闻都有报道。作为国内第一款单机大作:出圈的是游戏,输出的是中国文化,受到了广大游戏玩家的追捧和赞扬。 针对此热门事件,老王我用python爬虫和情感分析技术,针对B站的弹幕…

解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多。请稍后片刻再重试,或与系统管理员或技术支持联系“问题

当我们远程连接服务器连接不上并提示“为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多。请稍候片刻再重试,或与系统管理员或技术支持联系”时,根本原因是当前计算机远程连接时输入了过多的错误密码,触发系统策略自动锁定了。如果是你确定输入的密码没问题…