蓬莱「凯风快晴 −富士火山−」(单调栈优化)

news/2024/7/15 17:50:02 标签: 深度优先, 算法, 图论

蓬莱「凯风快晴 −富士火山−」

通过观察,很容易想到:

  1. i i i 层的结点数如果比第 i + 1 i+1 i+1 层更多,一定可以去掉若干第 i i i 层的节点,使得结点数与第 i + 1 i+1 i+1 层一样多。

  2. 不一定最下面一层的结点数最多,极端情况下,最下面一层如果只有 1 1 1 个结点,会限制上面每一层都只能取 1 1 1 个结点,很有可能得不到最优解。

  3. 先用 d f s dfs dfs 求出每一层结点数,然后使用单调栈优化,分别求出使用第 i i i 层作为最后一层时的最优解,并求出其中的最大值即可。

#include <iostream>
#include <vector>
using namespace std;
const int N = 5e5 + 7;
vector<int> vc[N];
int depth, dpt[N], lves[N];
struct Node { int x, id, s; } stk[N];
void dfs(int u, int fa) {
	dpt[u] = dpt[fa] + 1, ++lves[dpt[u]];
	depth = max(depth, dpt[u]);
	for (auto v : vc[u])
		if (v != fa)
			dfs(v, u);
}
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1, u, v; i < n; ++i) {
		scanf("%d%d", &u, &v);
		vc[u].emplace_back(v), vc[v].emplace_back(u);
	}
	dfs(1, 0);
	int mx = 0, tp = 0;
	// 使用单调栈求出最大值
	for (int i = 1; i <= depth; ++i) {
		while (tp && stk[tp].x>lves[i]) --tp;
		int s = stk[tp].s + (i-stk[tp].id)*lves[i];
		mx = max(s, mx);
		stk[++tp] = {lves[i], i, s};
	}
	printf("%d", mx);
}


http://www.niftyadmin.cn/n/229291.html

相关文章

IEEE SPL | 基于图注意力机制的音频语意概述

本文由哈工程智能信号处理组与悉尼科技大学、萨里大学合作&#xff0c;发表于IEEE信号处理学会期刊IEEE Signal Processing Letters&#xff0c;论文一作为2020级硕士研究生肖飞扬。 论文链接&#xff1a;https://arxiv.org/abs/2304.03586 论文代码&#xff1a;https://github…

MappingGenerator PRO 2023.3 Visual Studio 2019-2022

您的私人编码助手 MappingGenerator 最初是作为 AutoMapper 的设计时替代品创建的。现在它正在演变为编码助手&#xff0c;您可以将最平凡的编码任务委派给它&#xff1a; 生成映射生成显式转换实施克隆生成投影表达式脚手架方法调用脚手架对象创建清理方法调用方便ILogger的使…

MySQL数据库——数据库逻辑结构设计阶段(非常重要)

数据库逻辑结构设计是数据库设计的一个重要阶段&#xff0c;它是建立数据库的基础&#xff0c;涉及到数据库表、字段、关系等元素的设计和定义。在进行数据库逻辑结构设计之前&#xff0c;需要进行数据库需求分析&#xff0c;确定系统的需求&#xff0c;明确数据的流转和业务逻…

聚观早报|阿里云正式推出通义千问;京东零售开启5年最大组织变革

今日要闻&#xff1a;国家网信办规范生成式人工智能服务&#xff1b;阿里云正式推出通义千问&#xff1b;京东零售开启5年来最大组织变革&#xff1b;飞书将推出智能AI助手「My AI」&#xff1b;乐高将继续扩大在华零售布局国家网信办规范生成式人工智能服务 4 月 11 日&#x…

Eiseg标注软件

1. 安装 EISeg提供多种安装方式&#xff0c;其中使用pip和运行代码方式可兼容Windows&#xff0c;Mac OS和Linux。为了避免环境冲突&#xff0c;推荐在conda创建的虚拟环境中安装。 通过git将PaddleSeg克隆到本地&#xff1a; git clone https://github.com/PaddlePaddle/Pa…

图的传递闭包

给定一个有向图,对于给定图中的所有顶点对(i, j),找出一个顶点j是否可从另一个顶点i到达。这里的可达性是指从顶点i到j有一条路径。可达性矩阵称为图的传递闭包。 例如,考虑下面的图表 上述图的传递闭包为 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 该图以邻接矩阵的形式给出,…

【Linux内核解析-linux-5.14.10】内核总览

内核模块组成 Linux内核中有很多模块&#xff0c;以下是其中的一些&#xff1a; 文件系统模块&#xff1a;包括ext2、ext3、ext4、NTFS、FAT、XFS等文件系统模块。网络模块&#xff1a;包括TCP/IP协议栈、网络驱动程序等。设备驱动模块&#xff1a;包括硬盘、USB、网卡、声卡…

gdb调试技巧

GDB是GNU Debugger的缩写&#xff0c;是一款常用的命令行调试器&#xff0c;可用于调试C、C、汇编等程序。以下是一些常用的GDB调试技巧&#xff1a; 启动GDB&#xff1a;使用命令行启动GDB&#xff0c;如下所示&#xff1a; gdb <program>其中<program>是要调试的…