共42道题,当前是第32

初赛真题

小 Q 在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字 $1,2,3, \dots ,$ 进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存在一条通路(通路指连接两个元件的导线序列)。

在电路板上存在一个特殊的元件称为“激发器”。当激发器工作后,产生一个激励电流,通过导线传向每一个它所连接的节点,而中间节点接收到激励电流后,得到信息,件将该激励电流传向与它连接并且尚未接收到激励电流的节点。最终激励电流将到达一些“终止节点”接收激励电流之后不再转发的节点。

激励电流在导线上的传播是需要花费时间的,对于每条边 $E$,激励电流通过它需要的时间为te,而节点接收到激励电流后的转发可以认为是在瞬间完成的。现在这块电路板要求每一个“终止节点”同时得到激励电路--即保持时态同步。由于当前的构造并不符合时态同步的要求,故需要改变连接线的构造。目前小 Q 有一个道具,使用一次该道具,可以使得激励电流通过某条连接导线的时间增加一个单位。请同小 Q 最少使用多少次道具才可使得所有的“终止节点”时态同步?

输入第一行包含一个正整数 $n(1 \leq n \leq 5 * 10^5)$ ,表示电路板中节点的个数。

输入第二行包含一个整数 $S$ ,为该电路板的激发器的编号。

接下来 $N-1$ 行,每行三个整数 $a,b,t$ 。表示该条导线连接节点 $a$ 与节点 $b$ ,且激励电流通过这条导线需要 $t(1 \leq t \leq 10^6)$ 个单位时间。

提示:动态规划,代码中的 `read` 函数调用时会从输入读入一个整数, `for(X a: B)` 会枚举类型 `X` 的变量集合 `B` 中的每个元素,是 `C++14` 的新增语法。

试补全程序。

#include<bits/stdc++.h>

using namespace std;

typedef long long int_t;

int read() {
	int_t x = 0, w = 1;
	char ch = 0;
	while (!isdigit(ch)) {
		ch = getchar();
		if (ch == '-') w = -1;
	}
	while (isdigit(ch)) x = ___(1)___, ch = getchar();
	return x;
}

struct E {
	int_t to, w;
	E(int_t to0, int_t w0) {
		to = to0;
		w = w0;
	}
};

int_t ans;
vector < E > G[501000];

int_t dfs(int_t rt, int_t fa) {
	int_t ret = 0, cnt = 0;
	for (E e: G[rt])
		if (e.to != fa) {
			int_t res = dfs(e.to, rt) + e.w;
			if (___(4)___) ans += cnt * (res - ret), ___(3)___, cnt++;
			else ___(2)___, cnt++;
		}
	return ret;
}

int main() {
	int_t n = read(), s = read();
	for (int_t i = 1; i < n; i++) {
		int_t u = read(), v = read(), w = read();
		G[u].emplace_back(v, w);
		G[v].emplace_back(u, w);
	}
	___(5)___;
	cout << ans;
	return 0;
}

1. D。
2. B。
3. C。
4. A。
5. C。

这段代码是通过树形动态规划的方式来求出答案的。我们来具体讲解一下 `dfs` 函数里的内容。在到达一个点时,我们可以假设每个子树内部已经同步,那么要做的就是将子树之间进行同步。可以在递归时计算出每个子树从根到叶子结点需要多少时间。因为我们只能给一条边延时,所以一定是跟需要时间最长的子树同步。我们就可以在不断遍历子树时时刻维护这个最大的时间,也就是代码中的 $ret$ 变量。每找到一个新的子树时,如果其 $res<=ret$,那么直接在这条边上延时来同步即可;否则就需要更新 $ret$ 变量,将所有已经同步完成的子树再重新同步到新的 $ret$ 的时间中,代码中使用了 $cnt$ 来记录已经同步完成的子树个数用于完成该过程

Question

1. (1) 处应填 [ ]。

2. (2) 处应填 [ ]。

3. (3) 处应填 [ ]。

4. (4) 处应填 [ ]。

5. (5) 处应填 [ ]。

陈伦制作 版权所无 粤ICP备16127491号-1