栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【2022天梯赛——L2-3 龙龙送外卖】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【2022天梯赛——L2-3 龙龙送外卖】

思路

对于每个m其实都建了当前状态对应的树,根据当前的树的总权值可以计算出龙龙的工作量就是总权值的两倍减去最远节点的权值。

C++参考代码

一手代码,有待优化,仅供参考。

#include 

using namespace std;

const int N = 1e5 + 10;
int fa[N], v[N], wei[N];
int farpos, Tree_wei;
int find_wei(int w)
{
	if (wei[w] == 0 && !v[w]) wei[w] = find_wei(fa[w]) + 1;
	return wei[w];
}

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &fa[i]);
		if (fa[i] == -1)
		{
			v[i] = 1;
			farpos = i;
		}
	}
	//压缩路径求距离 复杂度相当于总权值
	for (int i = 1; i <= n; i++)
	{
		if (v[i] || wei[i]) continue;
		else wei[i] = find_wei(i);
	}
	for (int i = 1; i <= m; i++)
	{
		int pos;
		scanf("%d", &pos);
		for (int p = pos; !v[p]; p = fa[p])
		{
			v[p] = 1;
			Tree_wei++;
		}
		farpos = wei[farpos] > wei[pos] ? farpos : pos;
		printf("%dn", Tree_wei * 2 - wei[farpos]);
	}
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/835147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号