首页 > 其他分享 >230707 // 换根复习续

230707 // 换根复习续

时间:2023-07-07 16:26:23浏览次数:47  
标签:复习 min int 染色 换根 叶子 230707 代价 节点


A. 叶子的染色

http://222.180.160.110:1024/contest/3824/problem/1

不难发现题目非常难以看懂。其实题目的意思是,\(1\sim n\) 一定是叶子节点(就不能明说吗)。那么问题来了,这是一棵无根树,那么我们所选取的根会对答案造成影响吗?

由于 \(c_u\) 给定的是根节点到 \(u\) 路径上最后一个颜色,我们假设现在需要将根从 \(x\) 变成相邻的 \(y\),那么分讨一下:

  1. \(x\) 已染色,\(y\) 已染色:

    1. \(x\) 与 \(y\) 同色:

      该种情况不可能出现,因为对于在以 \(x\) 为根的树中,将 \(y\) 变为无色仍能达到要求,不可能成为最优解。

    2. \(x\) 与 \(y\) 异色:

      因为 \(y\) 已染色,在 \(y\) 引导的子树中,从 \(x\) 到任意叶子节点路径上的最后一个已染色结点都不可能是 \(x\),所以可以直接将 \(y\) 提为根,代价不变。

  2. \(x\) 已染色,\(y\) 未染色:

    这说明了 \(y\) 引导的子树的叶子没有任何一个以 \(y\) 为最后颜色,有的可能以 \(x\) 为最后颜色。那么我们只需要将 \(x\) 变为无色,\(y\) 变为 \(x\) 原本的颜色即可,代价不变。

  3. \(y\) 已染色,\(x\) 未染色:

    全树中没有任何一个叶子节点依赖于 \(x\),直接将 \(y\) 提上来即可。代价不变。

所以我们得到结论,随便选一个点当根都只能得到相同的答案。

注意大部分题解在这里得到的结论是任选一个非叶子当根,但实际上由上述推导可知任选一个点做根都是可以的。

设 \(f_{x, 0/1}\) 表示将 \(x\) 染成白色 / 黑色的最小代价,则有:

\[f_{u, 0} = 1 + \sum \min(f_{v, 0} - 1, f_{v, 1}) \\ f_{u, 1} = 1 + \sum \min(f_{v, 0}, f_{v, 1} - 1) \]

那有人可能就要问了,没有不将 \(x\) 染色这个选项吗?

从转移式子里可以看出来,将 \(x\) 染色还有让代价变得更小的可能性,要是不染色就不存在这种可能性了。况且,\(x\) 如果真的不需要染色,那么会在它的父节点处进行计算,总能得到正确的答案。

那根节点没有父节点,怎么办呢?我们知道,既然根节点可以染色,那说明至少有一个叶子依赖于根节点,那么将根节点染色的代价不会比将这些叶子染色的代价更大。

然后是初始化,对于叶子,\(f_{x, c_x} \gets 1, f_{x, 1 - c_x} \gets \inf\) 即可,对于非叶子,\(f_{x, 0/1} = 1\)。

时间复杂度 \(\mathcal O(n)\)。

#define int long long
namespace XSC062 {
using namespace fastIO;
const int inf = 1e18;
const int maxn = 2e5 + 5;
int a[maxn];
int f[maxn][2];
int n, m, x, y, w;
std::vector<int> g[maxn];
inline int min(int x, int y) {
	return x < y ? x : y;
}
inline int max(int x, int y) {
	return x > y ? x : y;
}
void DFS(int x, int fa) {
	for (auto i : g[x]) {
		if (i == fa)
			continue;
		DFS(i, x);
		f[x][0] += min(f[i][0] - 1, f[i][1]);
		f[x][1] += min(f[i][1] - 1, f[i][0]);
	}
	return;
}
inline void add(int x, int y) {
	g[x].push_back(y);
	return;
}
int main() {
	read(n), read(m);
	for (int i = 1; i <= m; ++i) {
		read(a[i]);
		f[i][a[i]] = 1;
		f[i][!a[i]] = inf;
	}
	for (int i = 1; i < n; ++i) {
		read(x), read(y);
		add(x, y), add(y, x);
	}
	for (int i = m + 1; i <= n; ++i)
		f[i][0] = f[i][1] = 1;
	DFS(n, -1);
	print(min(f[n][0], f[n][1]));
	return 0;
}
} // namespace XSC062
#undef int

听说这道题好像也是有换根做法的,但是我开摆。


B. 关键网线

http://222.180.160.110:1024/contest/3824/problem/2

标签:复习,min,int,染色,换根,叶子,230707,代价,节点
From: https://www.cnblogs.com/XSC062/p/17535272.html

相关文章

  • 20230707-编程语言的变量覆盖
    实现一个特性时,发现自定义的变量position覆盖了类的属性Position,近期发现始终存在的一个难以复现的窗口还原 BUG可能被因此修复了。也曾Debug过,但没能复现。问题的解决就是这样,只要你还惦记着,问题总会被解决。对于大小写不敏感度编程语言,尤其要注意大小写,所以我和我的朋......
  • 成语积累 20230707
    璞玉浑金:璞玉:未经人工雕琢的玉;浑金:没有冶炼过的金子。比喻人的品质纯美质朴,或指天然浑朴的精美之器。多用来形容人的品质淳朴善良。例句:这个小姑娘来自四川偏远的山区,给人一种~的感觉。例句2:现在的人都太现实,那种~的人基本很难找到了。假途灭虢:假:借;途:道路;灭:消灭;虢:春秋时诸侯国。......
  • 复习ES(6-11)语法之ES6下篇
    目录异步操作前置知识PromiseGenerator原理用法异步状态管理Iterator原生具备Iterator接口的数据结构Generator遍历不可迭代对象模块化规范异步操作前置知识JS是单线程的单线程即一个时间只能处理一个任务。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM......
  • 230706 // 换根 DP 复习
    菌:园什是我笋子元首:我是你打野我:元首耳朵得治G.求树的重心http://222.180.160.110:1024/contest/3744/problem/7我们知道,重心的定义是,将其切除后,每个连通块的大小不超过\(\dfracn2\)。连通块分为其子树和整棵树减去该结点引导的子树,所以我们记录size,在每次搜索结束后......
  • 2023-03-24-CQ 2023 省选前复习记录
    伝えに来たよ傷跡を辿ってそれならもう恐れるものはないんだと.CF449D看来我确实只会做板题/kk。一个很naive的想法是定义\(dp_{i,x}\)表示当前到了第\(i\)位,与起来的值为\(x\)的方案数,显然这个做不下去,因为状态数会有重叠,并且这复杂度会爆。一个不那么naiv......
  • 2023-02- NOI 春测复习记录
    Tosaygoodbyeistodiealittle.由于不可抗拒力,复习计划咕咕咕了。也不一定呢?P4755link关键在于要发现暴力的复杂度是对的。好像这个方法叫做\(\max\)分治,首先可以建一个大根的笛卡尔树,然后只需要对该点的管辖区间进行计算就可以了。具体做法是直接以最大值的点\(......
  • 【11.0】前端基础之阶段性复习
    【11.0】前端基础之阶段性复习【一】HTML【1】什么是HTML超文本标记语言,就是一堆标签,每个标签具有特定的意义,是浏览器展示页面所公用的一套标准HTML是一种用于构建网页的标记语言,全称为"HypertextMarkupLanguage"(超文本标记语言)。它由一系列标签(tag)组成,这些标签描述了网......
  • 复习ES(6-11)语法之ES6中篇
    目录类ES5中的类与继承ES6中的类与继承新的原始数据类型新的数据结构SetMap字符串的扩展正则的扩展数值的扩展ProxyReflect类类是对象的模版,定义了同一组对象共有的属性和方法ES5中的类与继承定义类ES5其实并没有类的概念,是通过function构造函数来模拟一个类。在构造函数......
  • 编译原理期末复习
    一、前言刚刚考完编译原理,不过可能是挂了,只是突击了b站的题型,但是却忽略了老师想要表达的东西。很多都是老师想调过,只恨自己后来没好好听课。在此总结一下我突击学过的题型、自己还不会的题型、老师认为是重点的题型,以便和大家共同学习(万一我要补考呢呜呜呜)二、老师留过的作业1......
  • WPF复习知识点记录
    WPF复习知识点记录由于近几年主要在做Web项目,客户端的项目主要是以维护为主,感觉对于基础知识的掌握没有那么牢靠,趁着这个周末重新复习下WPF的相关知识。文章内容主要来自大佬刘铁锰老师的经典著作《深入浅出WPF》。因为是复习,所以知识内容不会一一记录,如有需要了解更多可以看书......