E1. PermuTree (easy version) Codeforces Round 890 (Div. 2) E1

news2024/11/16 23:29:47

题目大意: 给出一个n个点的树,所有点权a[i]构成一个n的排列,点权可以任意分配给点,问最多有多少对u,v满足a[u]<lca(a[u],a[v])<a[v]

2<=n<=5000

思路:首先,如果两个点的lca是他俩其中之一,那么肯定不符合条件,所以符合条件的点对一定分别在一个点的两条子链上,我们先考察最小的子树,也就是像下图这样根的所有子链都没有分支:

可以发现,我们要让满足要求的数对最多,所以要么一条链上的点全部大于lca或全部小于lca,这样的话例如一条链长x全小于lca,一条长y,全大于lca,他们的贡献就是x*y如果有一对反过来,就会变成(x-1)*(y-1)+1*1,肯定更小。

那么问题就转变成了有x个数(x为子链数),怎样将这x个数分成两部分,使得一部分的和*另一部分的和最大,因为和最大是5000,所以我们可以用类似01背包的方法,求出所有能凑出来的和,即将所有所有链长存入数组q中,数组occ记录哪些和出现过,对于q[i],我们从5000到0枚举j,如果occ[j]=1,那么occ[j+q[i]]也为1,之所以要倒推就是因为一个数只能取一次,不能重复取,然后从1到sum(子节点总数)遍历i,如果occ[i]=1,就维护i*(sum-i)的最大值

这样我们就求出了对于上面这样的最小子树的答案数量,之后对于每个有多个子节点的点,都按此法将他们的子树长度分成两份,求和求乘积最大即可

 

//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
const int N = 5e3 + 5;
typedef long long ll;
const int INF = 0x7fffffff;
int head[N], tot = 0;
struct Edge
{
	int v, next;
}e[N];
void addedge(int u, int v)
{
	e[++tot].v = v;
	e[tot].next = head[u];
	head[u] = tot;
}
int n;
ll cnt[N];
void init()
{//初始化
	for (int i = 1; i <= n; i++)
	{
		cnt[i] = 0;
		head[i] = -1;
	}
	tot = 0;
}
ll ans = 0;
bool occ[N];
void dfs(int u)
{
	vector<ll>q;
	ll sum = 0;
	for (int i = head[u]; ~i; i = e[i].next)
	{
		int v = e[i].v;
		dfs(v);
		q.push_back(cnt[v]);//记录每棵子树的大小
		cnt[u] += cnt[v];//求子树大小
	}
	cnt[u] += 1;
	if (q.size()<=1)
		return;//子树数量<2肯定没贡献
	ll ma = 0;
	for (int i = 1; i <= n; i++)
	{
		occ[i] = 0;
	}
	occ[0] = 1;
	for (int i = 0; i < q.size(); i++)
	{//枚举每一棵子树
		sum += q[i];
		for (int j = n; j >= 0;j--)
		{//总合不超过n
			if (occ[j])
			{//j取过,q[i]就能取
				occ[j + q[i]] = 1;
			}
		}
	}
	for (int i = 1; i < sum; i++)
	{
		if (occ[i])
		{//枚举所有出现过的和,维护最大值
			ma = max(ma, i * (sum - i));
		}
	}
	ans += ma;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	init();
	for (int i = 1; i < n; i++)
	{
		int u;
		cin >> u;
		addedge(u, i + 1);
	}
	dfs(1);
	cout << ans << endl;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch之kibana相关命令

1.中文分词器相关命令 2.拼音分词器相关命令

vuejs 设计与实现 - 双端diff算法

我们介绍了简单 Diff 算法的实现原理。简单 Diff 算法利用虚拟节点的 key 属性&#xff0c;尽可能地复用 DOM元素&#xff0c;并通过移动 DOM的方式来完成更新&#xff0c;从而减少不断地创建和销毁 DOM 元素带来的性能开销。但是&#xff0c;简单 Diff 算法仍然存在很多缺陷&a…

设备使用RTMP推流到安防监控EasyCVR视频汇聚平台,为何只有FLV格式无法播放?

TSINGSEE青犀视频安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等功能。 智能视频监控平台EasyCVR可…

镭速-解析极速文件传输软件

每天都要传输文件&#xff0c;让人心烦意乱&#xff0c;如果有一种最快的文件传输软件&#xff0c;就能节约很多时间&#xff0c;那么针对用户的这个需求&#xff0c;我们来介绍一下镭速的文件传输软件&#xff0c;看它是否真的那么快&#xff0c;快得让你惊讶。 文件传输要怎么…

vue 09 多组件项目 todolist ,组件编程三部曲,函数方式传递消息,ref,自定义事件传递消息

分析项目组件构成&#xff1a; 组件编程三部曲&#xff1a; 第一步.先创建四个需要用到的组件 由于header&#xff0c;footer&#xff0c;list&#xff0c;item都和html文件或者是js的关键字有冲突&#xff0c;所以建议改成两个单词的名字&#xff0c;MyHeader&#xff0c;My…

2542. 最大子序列的分数

题目描述&#xff1a; 主要思路&#xff1a; 这是一个堆的题目&#xff0c;首先将2里边的下标按照数值递减的顺序进行重新排列。依次遍历2的下标同时加上1的数值&#xff0c;堆里边存储1的大小。 class Solution { public:long long maxScore(vector<int>& nums1, …

Leetcode | 有效的括号、最长有效括号

一、有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应…

用node.js搭建一个视频推流服务

由于业务中有不少视频使用的场景&#xff0c;今天来说说如何使用node完成一个视频推流服务。 先看看效果&#xff1a; 这里的播放的视频是一个多个Partial Content组合起来的&#xff0c;每个Partial Content大小是1M。 一&#xff0c;项目搭建 &#xff08;1&#xff09;初…

可靠传输-回退N帧协议

上图中&#xff0c;第一幅图为停止等待协议&#xff0c;而第二幅图为流水线传输&#xff0c;是在接收方返回确认收到的数据之前发送N个数据分组。 回退N帧协议GBN&#xff08;go-back-N&#xff09;&#xff1a; 无差错情况&#xff1a; 1.采用3个比特给分组编号&#xff0c…

从小白到大神之路之学习运维第76天-------Kubernetes工作原理(k8s)

第四阶段 时 间&#xff1a;2023年8月9日 参加人&#xff1a;全班人员 内 容&#xff1a; Kubernetes工作原理 目录 一、案例概述 传统部署时代&#xff1a; 虚拟化部署时代&#xff1a; 容器部署时代&#xff1a; 二、Kubernetes概述 &#xff08;一&#xff…

Pytorch Tutorial【Chapter 3. Simple Neural Network】

Pytorch Tutorial【Chapter 3. Simple Neural Network】 文章目录 Pytorch Tutorial【Chapter 3. Simple Neural Network】Chapter 3. Simple Neural Network3.1 Train Neural Network Procedure训练神经网络流程3.2 Build Neural Network Procedure 搭建神经网络3.3 Use Loss …

机器学习、深度学习项目开发业务数据场景梳理汇总记录二

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

直播预告 | 全面解读现代发布/订阅模型

线上沙龙-技术流第 34 期营业啦 08月10日&#xff08;周四&#xff09;19:30 KaiwuDB - B站直播间 PubSub 模式在 IoT 场景下非常常见&#xff0c;可以灵活地在线配置采集数据的流向。同时 PubSub 可以使系统容易解耦&#xff0c;增加系统的横向扩展性。 本期直播我们邀请到…

8月第1周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年7月31日-8月06日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

tft_espi 中文字体及自定义字体制作(tft.eSPI模块)

tft.eSPI库自定义字体方法 先下载 processing 然后安装 到mixly安装目录下找到tft_eSPI文件夹 路径如&#xff1a;D:\Mixly1.20\arduino\portable\sketchbook\libraries\TFT_eSPI\Tools 将Tools文件夹单独复制出来如我的为 E:\tft_espi字体制作Tools 在tft_espi字体制作To…

【香瓜说职场】建立公司(2017.07.25)

自从17年4月份开始辞职创业&#xff0c;已经3个多月了。跟大家分享一下创业经历。 一、我的合伙人 我的合伙人是我的客户。我给他上过蓝牙教学课、帮他做了个蓝牙自拍器&#xff08;叫orbit 360&#xff0c;已在售&#xff0c;百度能搜到&#xff09;&#xff0c;历经一年多。双…

今天学前端,还能高薪就业吗?

大学毕业3年后&#xff0c;我坚定的选择来黑马转行学前端&#xff0c;实现我的高起点就业&#xff01;希望我的一些学习和工作感悟能对学弟学妹们有所帮助。 学科 | HTML&JS前端 校区 | 武汉 薪资 | 12k 黑马程序员的学弟、学妹们大家好&#xff01;我是张同学。 选择黑…

vue基础-vue开发如何调试

文章目录 前言一、debugger二、Vue.js devtools总结 前言 对于一个前端小白来说&#xff0c;在vue项目开发过程中&#xff0c;当遇到应用逻辑出现错误&#xff0c;使用好调试工具更能准确定位到问题。所以知晓Vue项目调试技巧至关重要&#xff0c;debug是必备技能。 下面介绍…

负责任的训练数据:三个重要方面

毫无疑问&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;技术一定会在接下来的几年中持续快速发展&#xff0c;并与我们的日常生活愈发密切地联系在一起。现在&#xff0c;企业必须要承担起责任&#xff0c;实施负责任的AI&#xff0c;以最大限度地提高透…

MySQL的第一篇文章——了解数据库、简单的SQL语句

目录 学习目标 第一章 介绍数据库 1. 数据库概述 2. MySQL概述 第二章 MySQL的使用 1. MySQL服务的启动 2. 客户端连接MySQL 2.1 命令行客户端 第三章 SQL的介绍 1. 什么是SQL 2. SQL的分类 3. MySQL的语法规范和要求 第四章 DDL操作数据库 1. 创建数据库 2. 查…