首页 > 其他分享 >P8314 [COCI2021-2022#4] Parkovi

P8314 [COCI2021-2022#4] Parkovi

时间:2024-11-13 11:31:15浏览次数:1  
标签:std P8314 COCI2021 int 公园 2022 mn mx dp

最大值最小是二分答案的特征。二分完后每个公园可以覆盖距离不超过 \(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);
} 

标签:std,P8314,COCI2021,int,公园,2022,mn,mx,dp
From: https://www.cnblogs.com/purplevine/p/18543559

相关文章

  • 国标GB28181软件LiteGBS国标GB28181-2022平台是多场景视频云服务平台
    LiteGBS国标GB28181软件是一款基于国标GB/T28181协议的视频云服务平台,支持多路设备同时接入,并可分发RTSP、RTMP、FLV、HLS、WebRTC等多种格式的视频流。该平台实现了Web浏览器、手机浏览器、微信、PC等各类终端的无插件播放,提供灵活高效的视频监控和管理解决方案。LiteGBS国标......
  • pjsip编译、说明及vs2022使用示例
    环境:window10_x64&vs2022pjsip版本:2.14.1 之前整理过pjsip2.10的编译及python使用示例:https://www.cnblogs.com/MikeZhang/p/pjsip20210116.htmlhttps://www.cnblogs.com/MikeZhang/p/win10py3pjsua-20211010.html 今天整理下pjsip2.14.1的编译、接口说明,以及在vs......
  • P8162 [JOI 2022 Final] 让我们赢得选举 (Let's Win the Election) 题解
    P8162[JOI2022Final]让我们赢得选举(Let'sWintheElection)题解朴素的想法是先抓一部分人,再一起去发表演讲。这样就要按\(b\)的值从小到大排序,枚举选择的一部分\(b\)值,在后面挑选一些最小的\(a\)选择即可。但这样显然是错误的。观察到\(n\le500\),显然是\(O(n^3......
  • 20222301 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容(1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:①DNS注册人及联系方式②该域名对应IP地址③IP地址注册人及联系方式④IP地址所在国家、城市和具体地理位置(2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并查询获取该好友所......
  • Eplan2022卡顿问题解决
    EPLAN2022卡顿崩溃怎么解决 第一步:可以检查下用户设置。打开菜单"选项→设置:用户→翻译→字典":不勾选"自动完成"和"自动更正"。在选项设置框中输入"自动",快速找到用户设置,取消勾选,如下图。 第二步:可以检查下电脑语言设置。设置:常规→兼容性"。如下图。 ......
  • Visual Studio vs2010到2022各个版本的的永久激活密钥
    VisualStudiovs2010到2022各个版本的的永久激活密钥前言以下密钥均收集于网络,但均可以正常激活VS2022专业版和企业版的密钥VisualStudio2022Pro(专业版)TD244-P4NB7-YQ6XK-Y8MMM-YWV2JVisualStudio2022Enterprise(企业版)VHF9H-NXBBB-638P6-6JHCY-88JWHVS2019专业版和企......
  • 20222318 2024-2025-1 《网络与系统攻防技术》实验四实验报告
    1.实验内容1.1实验任务(1)恶意代码文件RaDa.exe类型标识、脱壳与字符串提取。(2)使用IDAPro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。(3)分析一个自制恶意代码样本rada,并撰写报告,回答问题。(4)取证分析实践:对于Snort收集的蜜罐主机5天的网络数......
  • 20222402 2024-2025-1《网络与系统攻防技术》实验四实验报告
    一、实验内容本周学习内容计算机病毒(Virus):通过感染文件(可执行文件、数据文件、电子邮件等)或磁盘引导扇区进行传播,一般需要宿主程序被执行或人为交互才能运行蠕虫(Worm):一般为不需要宿主的单独文件,通过网络传播,自动复制通常无需人为交互便可感染传播恶意移动代码(Malicio......
  • 20222409 2024-2025-1 《网络与系统攻防技术》实验四实验报告
    1.实验内容1.1本周学习内容本周学习了恶意代码分析的基本方法,静态分析和动态分析的核心概念。静态分析主要通过代码结构和API调用等特征来识别恶意行为,动态分析则使用沙箱等环境运行代码,观察其行为。通过实验学习了IDAPro和ProcessMonitor等工具的基本操作。1.2实践内容......
  • 20222319 2024-2025-1 《网络与系统攻防技术》实验四实验报告
    1.实验要求1.1实验内容一、恶意代码文件类型标识、脱壳与字符串提取对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;(2)使用超级巡警脱壳......