CF1006E - Military Problem(搜索技术+图论+树/省选级)

CF1006E - Military Problem(源地址自⇔CF1006E

目录

Problem

CF1006E - Military Problem(搜索技术+图论+树/省选级)

tag

⇔搜索技术、⇔图论、⇔树、⇔省选级(*1600)

题意

军队传递消息依照某种规律,如下:

  • 消息的传递总是以树的形式,从上级层层下传,传递到下级。
  • 对于同一级的人员,编号越小的士兵越早被传递消息。

现在,某个上级 \(u\) 试图将消息传递到他的第 \(v\) 个下级处,请你判断这个下级是谁。

思路

(朱老师)

非常简单的树形搜索。


(队内赛自己)

建树,然后使用搜索技术得出这棵树的DFS序和每个士兵的下级数量。

  • 先判断第 \(v\) 个下级是否存在(与子节点数量比较)。
  • 若存在,在DFS序中找到 \(u\) ,那么 \(u\) 之后的第 \(v-1\) 个士兵即为答案。

AC代码(伪代码)

void dfs(int x) {
    a[++ m] = x;//a数组储存DFS序
    flag[x] = m;
    siz[x] = 1;//子节点统计数组(包含它自己)
    For(i, V[x]) {
    	dfs(i);
    	siz[x] += siz[i];
    }
}

void solve() {
	cin >> n >> q;
	FOR(i, 2, n) {
		cin >> x;
		V[x].push_back(i);
	}
	dfs(1);
	FOR(i, 1, q) {
		cin >> x >> y;
		if(siz[x] < y)
			P(-1);
		else
			P(a[flag[x] + y - 1]);
	}
}

错误次数

(队内赛1、2,补题1)误以为DFS序的第 \(u\) 个元素就是上级 \(u\) ,导致直接计算。


文 / WIDA
2021.12.21 成文
首发于WIDA个人博客,仅供学习讨论


更新日记:
2021.12.21 成文


上一篇:【Gym 102893 L】The Firm Knapsack Problem (贪心)


下一篇:pip安装virtualenvwrapper时报错解决方法