CF708C Centroids [树形DP,换根DP]

news/2024/10/7 19:01:39/文章来源:https://www.cnblogs.com/chenwenmo/p/18450424

Description

给定一棵树。
至多进行一次操作:删去一条边,连接一条新边,保证操作完后仍是树。
问每个点在进行操作后是否可以成为树的重心。

Solution

性质\(1\):若一个点不是树的重心,则它的必然有一个大小大于 \(\lfloor n/2\rfloor\) 的子树。

性质\(2\):如果一个点合法,要么它本来就是重心,要么它只有一个子树大于 \(\lfloor n/2\rfloor\),且从这个子树中移除一个最大的小于等于 \(\lfloor n/2\rfloor\) 的子树可以使它自己也小于等于 \(\lfloor n/2\rfloor\)

考虑 树形dp,设 \(f(u)\) 表示以 \(u\) 为根的子树中,最大的不超过 \(\lfloor n/2\rfloor\) 的子树大小,初始先以 \(1\) 为总根,转移如下,
\(size_v\le \lfloor n/2\rfloor\) 时,\(f(u) = \max(f(u),size_v)\)
否则 \(f(u) = \max(f(u),f(v))\)
\(v\in son_u\)

考虑如何处理子树外的答案,即换根,设 \(g(u)\) 表示不在以 \(u\) 为根的子树内的答案,
为了方便转移,我们需要更改一下状态 \(f\),设 \(f(u,0/1)\) 分别表示最大答案和次大答案,转移和原来类似,然后还要记录一下每个点的最佳转移状态,就是它最终是由哪个点转移过来的,
\(g\) 的转移如下,
\(f(u,0)\) 的最佳转移是 \(v\) 时,

  • 如果 \(n-size_u\le \lfloor n/2\rfloor\),那么 \(g(v) = \max(g(u),n-size_u,f(u,1))\)
  • 否则 \(g(v) = \max(g(u),f(u,1))\)

否则,

  • 如果 \(n-size_u\le \lfloor n/2\rfloor\),那么 \(g(v) = \max(g(u),n-size_u,f(u,0))\)
  • 否则 \(g(v) = \max(g(u),f(u,0))\)

最终根据性质\(2\),判断每个点是否合法即可。

Code

const int N = 4e5 + 5;int n;vector <int> e[N];int siz[N], f[N][2], mx[N]; // f(u) : 以 u 为根的子树内满足大小 <=n/2 的最大和次大子树大小 (整棵树以 1 为根)// mx(u) : 记录 f(u) 的最佳转移 v
int g[N];
bool ans[N];void dfsF(int u, int fa){siz[u] = 1;for(int v : e[u]){if(v == fa) continue;dfsF(v, u);siz[u] += siz[v];if(siz[v] <= n / 2){if(siz[v] > f[u][0]){ // 最大和次大不能从同一个子树转移!f[u][1] = f[u][0];f[u][0] = siz[v];mx[u] = v;}else if(siz[v] > f[u][1]) f[u][1] = siz[v];}else{if(f[v][0] > f[u][0]){f[u][1] = f[u][0];f[u][0] = f[v][0];mx[u] = v;}else if(f[v][0] > f[u][1]) f[u][1] = f[v][0];}}
}void dfsG(int u, int fa){for(int v : e[u]){if(v == fa) continue;if(mx[u] == v){if(n - siz[u] <= n / 2) g[v] = max(f[u][1], n - siz[u]);else g[v] = max(f[u][1], g[u]);}else{if(n - siz[u] <= n / 2) g[v] = max(f[u][0], n - siz[u]);else g[v] = max(f[u][0], g[u]);}dfsG(v, u);}
}void dfsAns(int u, int fa){int mx = n - siz[u];int cnt = 0, id = -1;if(mx > n / 2) id = fa, cnt++;for(int v : e[u]){if(v == fa) continue;if(siz[v] > n / 2){mx = siz[v];id = v;cnt++;}dfsAns(v, u);}if(cnt == 0) ans[u] = true;else if(cnt == 1 && id == fa && mx - g[u] <= n / 2) ans[u] = true;else if(cnt == 1 && id != fa && mx - f[id][0] <= n / 2) ans[u] = true;else ans[u] = false;
}void Solve(){cin >> n;int u, v;for(int i = 1; i <= n - 1; i++){cin >> u >> v;e[u].ps(v);e[v].ps(u);}dfsF(1, 0);dfsG(1, 0);dfsAns(1, 0);for(int i = 1; i <= n; i++) cout << ans[i] << ' ';
}

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

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

相关文章

React Fiber 原理

React Fiber 在 React 16 之前的版本对比更新 VirtualDOM 的过程是采用 Stack 架构实现的,也就是循环加递归,这种方式的问题是一旦任务开始进行就无法被中断。 如果应用中的组件数量庞大, Virtual DOM 的层级比较深,主线程被长期占用,知道整颗 Virtual DOM 树比对更新完成…

视野修炼-技术周刊第104期 | 下一代 JavaScript 工具链

① 🐙 尤大创办公司 VoidZero ② Tauri 2.0 稳定版发布 ③ Vite 时髦的新主页 ④ qrframe - 漂亮二维码生成 ⑤ HTTP QUERY 方法提案 ⑥ TinyJS - 轻量级的创建DOM元素 ⑦ 9月 Web 平台的新功能 ⑧ ESLint 现在正式支持 Linting JSON 和 Markdown欢迎来到第 104 期的【视野修…

雅礼国庆集训 day1 T2 折射

题面 题面下载 算法 转化题意 说白了就是给了你一堆点,让你数这种折线有多少个 (严格向下走,并且横坐标之间的差越来越小)看着像一种在 y 轴方向排序的 dp 但是由于是折线, 所以需要加一维来判断转向 dp 设计 状态设计 \(dp_{i, 0/1}\) 表示第 i 个点, 是向左下还是右上 状态…

React 中的 diff 算法

React diff为什么使用虚拟 DOM ? 浏览器在处理 DOM 的时候会很慢,处理 JavaScript 会很快,页面复杂的时候,频繁操作 DOM 会有很大的性能开销(每次数据变化都会引起整个 DOM 树的重绘和重排)。 为了避免频繁操作 DOM,React 会维护两个虚拟 DOM,如果有数据更新,会借此计…

20222315 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1.掌握反汇编与十六进制编程器 2.能正确修改机器指令改变程序执行流程 3.能正确构造payload进行bof攻击 2.实验过程 1.直接修改程序机器指令,改变程序执行流程 将pwn1文件下载至kali中并将pwn1文件改名为pwn20222315,并将其内容复制到pwn2反汇编文件objdump -d…

多校A层冲刺NOIP2024模拟赛03

多校A层冲刺NOIP2024模拟赛03\(T1\) A. 五彩斑斓(colorful) \(90/100pts\)部分分\(20pts\) :枚举左上 \((k,h)\) 、右下端点 \((i,j)\) ,时间复杂度为 \(O(n^{2}m^{2})\) 。 \(90/100pts\) :当 \(a_{i,j} \ne a_{k,j}\) 时任意的 \(h \in [1,j]\) 都符合题意、不妨钦定 \(…

Word中 Endnote 引用标蓝色

1. 打开word中的endnote加载项。如图所示,勾选这两个设置。 确认后会自动变为超链接,显示蓝色以及下划线。 2. 在样式设置中,将超链接的下划线取消。之后就会只显示蓝色引用。 结果显示:

中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1)

中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1) Problem A. 贵校是构造王国吗 I 思路 官方题解很清晰明了。代码 #include <bits/stdc++.h> using namespace std; #define int long long #define endl \n #define PII pair&…

多校 A 层冲刺 NOIP2024 模拟赛 03

多校 A 层冲刺 NOIP2024 模拟赛 03 T1 五彩斑斓(colorful) 签到题 直接暴力枚举是 \(O(n^4)\) ,考虑使用 \(bitset\) 优化,对每个点开个 \(bitset\),预处理它所在一行它及它之前相同颜色的位置,这样就只用枚举另一个点所在列,时间复杂度为 \(O(n^3+\frac{n^4}{w})\)。 T…

在浏览器上访问媒体资源配置【文件上传】

1.根urls.py文件中 from django.contrib import admin from django.urls import path, include, re_path from django.views.static import serve from django.conf import settingsurlpatterns = [# path(admin/, admin.site.urls),path(api/shipper/, include(apps.shipper.u…

高级程序语言设计第二次作业

姓名:袁志华 班级:软件工程2班 学号:102400231 班级网址:https://edu.cnblogs.com/campus/fzu/2024C 作业网址:https://edu.cnblogs.com/campus/fzu/2024C/homework/13282 图片: 第一题: 第二题: 第三题: 第四题: 第五题: 第六题: 第七题: 第八题:程序清单: 3.1…

macOS Sequoia 15.0.1 (24A348) 正式版 ISO、IPSW、PKG 下载

macOS Sequoia 15.0.1 (24A348) 正式版 ISO、IPSW、PKG 下载macOS Sequoia 15.0.1 (24A348) 正式版 ISO、IPSW、PKG 下载 iPhone 镜像、Safari 浏览器重大更新和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接:https://sysin.org/blog/macOS-Sequoi…