Educational Codeforces Round 144 (Rated for Div. 2) E

news2024/11/15 21:38:40

人菜瘾大还是忍不住打了这场比赛,b卡了半小时,甚至还写了一个最长公共子序列然后喜提wa2,但是c,d还是过的比较快,最后排名rk175有惊无险的上分了,e题赛时一眼想出思路,但是我的实现能力有限,没能在赛时通过,赛后补了这道题,狠狠抽打了我自己的码力,马上要ec了,未来的队友还需要我去当代码手实现思路,在这里狠狠拷打一下我自己。

简要题意 给你一颗树,问你划分成若干条颜色段,颜色段必须联通,并且颜色段每个点的深度不同,问你颜色段最小值的最大值是多少。

看到这个题,第一反应就是做贪心,我们可以比较套路性地想到我们可以从底往上做,我们先处理子树,再处理当前节点。根据题意,我们不难发现,这个颜色段一定是一条链,而且是从上到下平铺在树上,即链上的任意两点的lca为 l c a ( u , v ) = = u 或 l c a ( u , v ) = = u lca(u , v) == u 或 lca(u , v) == u lca(u,v)==ulca(u,v)==u
在这里插入图片描述
然后我们考虑由下到上贪心,我们对于一个点 u u u,我们维护两个值,一个是节点u所在的颜色段的长度,当前子树颜色段的最小值。

接下来考虑转移我们对于一个节点 u u u,我们可以从儿子所在的链种选择一条链,然后接上节点u。
在这里插入图片描述
如上图所示,我们对于一个节点u,我们可以从三个儿子维护的链中选择一个接上u,如果我们采取接上s1,则为下图所示。
在这里插入图片描述
然后我们现在有若干个儿子,我们该如何去接儿子呢,我们先对儿子的链大小进行排序,我们应该去接长度最短的链。原因:考虑贪心地让最小值最大,如果我们考虑不接长度最短的,答案一定小于等于长度最短的链,若接到长度最短的链,答案就小于等于次小值,答案更大,更优,所以我们一定接在最短的一条链上, 然后没有被接到 u u u的链,我们把他放到u子树颜色段的最小值去维护(即第二关键字),然后我们确定一个根,然后 d f s dfs dfs一遍我们就可以得到某个点为根时的答案了,我们如何求全局最小值,我们考虑暴力地把每个根都跑一遍,时间复杂度是 O ( n 2 ) O(n ^ 2) O(n2),我们就考虑换根dp的思路去做,用换根dp的思路去维护这种转移即可。
代码实现难度比较大,我写了一个最小次小的封装类,然后维护不同的信息即可。

双倍经验!
代码的大致思路类似于1778E,可以参考我之前写的博文。

代码

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <bits/stdc++.h>

#define x first
#define y second 

#define int long long 

using namespace std ;

int read(){
	int res = 0 , flag = 1 ;
	char c = getchar() ;
	while(!isdigit(c)){
		if(c == '-') flag = -1 ;
		c = getchar() ;
	}
	while(isdigit(c)){
		res = (res << 1) + (res << 3) + (c ^ 48) ;
		c = getchar() ;
	}
	return res * flag ; 
}

void write(int x){
	if(x < 0) {
		putchar('-') ;
		x = - x ;
	}
	if(x >= 10) write(x / 10) ;
	putchar('0' + x % 10) ;
}

void write(int x , char c){
	write(x) ;
	putchar(c) ; 
}

const int N = 2e5 + 10 ;
typedef pair<int , int> pii ;
typedef pair<double ,double> pdd ;
const int mod = 998244353 ;
const int inf = 1e9 + 10 ;
const int M = 2 * N ;

struct T{
	int a[2] = {inf , inf} ;
	void insert(int x){
		if(a[0] >= x) a[1] = a[0] , a[0] = x ;
		else a[1] = min(a[1] , x) ;   		
	}
	void r(){
		if(a[0] > a[1]) swap(a[0] , a[1]) ; 
	}
	T operator+(T& b)const{
		T c ;
		c.a[0] = a[0] ;
		c.a[1] = a[1] ;	
		c.insert(b.a[0]) ;
		c.insert(b.a[1]) ;
		return c;
	}
	T(){
		
	}
	T(int x , int y){
		a[0] = x ,  a[1] = y ;
	}
} ;

int h[N] , e[M] , ne[M] , idx ;

void add(int a , int b){
	e[idx] = b , ne[idx] = h[a] , h[a] = idx ++ ; 
}

pii dp[N] , f[N] ;

void dfs(int u , int v){
	T t ;  
	int res = inf ; 
	for(int i = h[u] ; ~i ; i = ne[i]){
		int j = e[i] ;
		if(j == v) continue ;
		dfs(j , u) ;
		t.insert(dp[j].x) ; 
		res = min(res , dp[j].y) ;
	}
	if(t.a[0] == inf) dp[u].x = 1 ;
	else dp[u].x = t.a[0] + 1 ;
	dp[u].y = min(t.a[1] , res) ; 
}

int ans ;

void dfs1(int u , int v){
	T t ;
	// cout << u << " " << v << " " << f[v].x << " " << f[v].y << endl ;
	int res = inf ;
	for(int i = h[u] ; ~i ; i = ne[i]){
		int j = e[i] ;
		if(j == v) continue ;
		t.insert(dp[j].x) ;
		res = min(res , dp[j].y) ;
	}
	t.insert(f[v].x) ;
	res = min(res , f[v].y) ;
	// cout << "res" << res << endl ;
	ans = max(ans , min(t.a[0] + 1 , min(res , t.a[1]))) ;
	
	vector<T> pre(1) , suf(1) ;
	vector<int> p(1 , inf) , s(1 , inf) ; 
	int cnt = 0 ;
	for(int i = h[u] ; ~i ; i = ne[i]){
		int j = e[i] ;
		if(j == v) continue ;
		++ cnt ; 
		p.push_back(dp[j].y) ;
		s.push_back(dp[j].y) ;
		pre.push_back(T(dp[j].x , inf)) ;
		suf.push_back(T(dp[j].x , inf)) ; 
	}
	pre.push_back(T(inf , inf)) ;
	suf.push_back(T(inf , inf)) ;
	p.push_back(inf) ;
	s.push_back(inf) ;
	for(int i = 1 ; i <= cnt ; i ++){
		pre[i] = pre[i] + pre[i - 1] ;
		p[i] = min(p[i] , p[i - 1]) ;
	}
	for(int i = cnt ; i ; i --){
		suf[i] = suf[i + 1] + suf[i] ;
		s[i] = min(s[i] , s[i + 1]) ; 
	}
	cnt = 0 ; 
	for(int i = h[u] ; ~i ; i = ne[i]){
		int j = e[i] ;
		if(j == v) continue ; 
		++ cnt ;
		T tt ;
		int rr = inf ;
		rr = min(rr , f[v].y) ;
		rr = min(p[cnt - 1] , rr) ;
		rr = min(s[cnt + 1] , rr) ;
		tt.insert(f[v].x) ;
		tt = tt + pre[cnt - 1] ;
		tt = tt + suf[cnt + 1] ;
		rr = min(tt.a[1] , rr) ;
		if(tt.a[0] == inf) f[u] = {1 , rr} ;
		else
			f[u] = {tt.a[0] + 1 , rr} ; 
		dfs1(j , u) ; 
	}
	
}
void solve() {
	int n = read() ;
	for(int i = 1 ; i <= n ; i ++) h[i] = -1 ; 
	idx = 0 ;
	for(int i = 1 ; i < n ; i ++){
		int a = read() , b = read() ;
		add(a , b) , add(b , a) ; 
	}
	dfs(1 , 1) ; 
	f[0] = {inf , inf} ;
	ans = 0 ; 
	dfs1(1 , 0) ; 
	// cout << min(dp[1].x , dp[1].y) << endl ;
	write(ans , '\n') ;
}

signed main(void){
	int T = read() ;
	while(T --)
		solve() ; 
}

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

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

相关文章

谷歌关键词排名上首页需要多久【2023年实战数据】

本文主要分享2023年实战得出谷歌做新站关键词排名到首页所需要的时间周期测试。 本文由光算创作&#xff0c;有可能会被剽窃和修改&#xff0c;我们佛系对待这种行为吧。 谷歌关键词排名上首页需要多久&#xff1f; 答案是&#xff1a;90天左右。 具体以下图实战数据为主 关…

【总结】记一次log4j包冲突引发es类找不到的问题

问题现象 某天&#xff0c;某个应用搞新的迭代&#xff0c;突然报ElasticSearch 7.17.5 相关操作都失败了&#xff0c;且问题是必现&#xff0c;本地启动也能稳定复现。组内小伙伴按照es jar包冲突排查了一番&#xff0c;无果&#xff0c;于是问题转交给我来排查。 错误信息是…

计算机网络(第三版) 胡亮 第四章知识点总结

计算机网络&#xff08;第三版&#xff09; 胡亮 第四章知识点总结 学习指导 1、掌握询问/确认、轮询/选择模式的使用场合与工作方式 2、掌握停止等待协议的流量控制和差错控制&#xff0c;会进行相关定量的计算。 3、掌握滑动窗口协议中的回退N和选择控制的工作方式 4、了…

重拾JS基础:掌握闭包和作用域链的秘密,让你代码更加简洁优雅

在 JavaScript 中&#xff0c;闭包和作用域链是两个重要的概念&#xff0c;对于理解 JavaScript 中函数的工作方式和实现高级功能非常关键。本文将介绍闭包和作用域链的概念、如何创建和使用闭包&#xff0c;以及如何避免常见的陷阱和错误。 引言 JavaScript 是一门具有函数式编…

基于神经网络的滑模鲁棒控制

目录 前言 1.双关节机械手臂模型 2.神经网络自适应律设计 3. 滑模控制律设计 4. 仿真分析 4.1 仿真模型 4.2 仿真结果 4.3 小结 5 学习问题 前言 上一篇文章我介绍了神经网络补偿的机理&#xff0c;只不过控制律不同&#xff0c;本章我们结合滑模理论设计控制律&#…

不同规划企业对CRM系统的性价比要求

很多企业在选型时关心CRM客户管理系统的价格&#xff0c;有人对CRM的价格完全没有概念&#xff0c;也有的人先问价格再看其他。CRM价格在系统选型中到底有多重要&#xff1f;如何评估CRM价格和价值之间的关系&#xff1f;企业规模对CRM系统价格有什么影响&#xff1f; CRM软件…

Android系统10 RK3399 init进程启动(四十八) init第一阶段分析

配套系列教学视频链接&#xff1a;安卓系列教程之ROM系统开发-百问100ask说明系统&#xff1a;Android10.0设备&#xff1a; FireFly RK3399 &#xff08;ROC-RK3399-PC-PLUS&#xff09;前言本文通过代码梳理的方式&#xff0c;给大家介绍Android init祖先进程第一阶段的工作流…

MAC地址申请MAC码购买流程MAC地址哪里申请MAC地址作用

众所周知mac地址号段全世界都是由美国一家政府机构IEEE进行分配的&#xff0c;也是由他们进行管理的。我站具有丰富的MAC地址申请经验&#xff0c;可以帮助客户有效的快速高效的完成MAC地址的申请。关于mac地址购买种类、范围、方式、费用详情如下。 一、服务项目&#xff1a;…

vue3、vite、pinia 快速入门

准备 开发工具及插件IDE:vscode,WebStorm插件&#xff1a;Auto Close Tag、Auto Rename Tag、Live Server通过“&#xff01;”快速生成html模板正式学习安装vue通过CDN的方式导入vue<script src"" target"_blank">https://unpkg.com/vue3/dist/vue.…

mysql数据库之索引分类

分类含义特点关键字主键索引针对于表中主键创建的索引默认自动创建&#xff0c;只能有一个primary唯一索引避免同一个表中某数据列中的值重复可以有多个unique常规索引快速定位特定数据可以有多个全文索引全文索引查找的是文本中的关键词&#xff0c;而不是比较索引中的值可以有…

01 Android基础--广播

01 Android基础--广播什么是广播&#xff1f;广播的分类本地广播LocalBroadcastManager什么是广播&#xff1f; 传输信息的机制。 主要记住三个要素&#xff1a;1.广播(Broadcast) - 用于发送广播; 2.广播接收器(BroadcastReceiver) - 用于接收广播&#xff1b;3.意图内容(Inte…

【活学活用掌握trap命令】

trap 命令用于指定在接收到信号后将要采取的动作&#xff0c;常见的用途是在脚本程序被中断时完成清理工作。当 shell 接收到 sigspec 指定的信号时&#xff0c; arg 参数(通常是执行命令)会被读取&#xff0c;并被执行。 1. 命令介绍 开始掌握基本的使用方式和方法 [1] 语法…

云计算简介

本文为copy他人编写的文档&#xff0c;由于不确认作者名称&#xff0c;故无法标记来源&#xff08;实际来源是群pdf文档&#xff09;&#xff0c;暂时发文为原创&#xff0c;因为无法贴出原文链接&#xff01; 云原生的前世今生 随着公有云和私有云的广泛部署&#xff0c;云计…

1.1 Linux开发环境搭建

1. Ubuntu服务器安装ssh工具&#xff0c;然后使用xshell连接 查看Ubuntu服务器的IP地址时&#xff0c;如果ifconfig失败&#xff0c;需要先安装一下net工具 sudo apt install openssh-server sudo apt install net-tools2. 打开vscode&#xff0c;安装Remote Development拓展…

操作系统——11.线程概念和多线程模型

这篇文章我们来讲一下操作系统中的线程概念和多线程模型 目录 1.概述 2.线程 2.1问题提出 2.2线程概念 2.3带来的变化 2.4线程的属性 2.5线程的实现方式 2.5.1用户级线程 2.5.2内核级线程 2.5.3相互组合 2.6多线程模型 2.6.1多对一模型 2.6.2一对一模型 2.6.3多…

操作系统权限提升(二十二)之Linux提权-SUDO滥用提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 操作系统权限提升(十九)之Linux提权-SUID提权 操作系统权限提升(二十)之Linux提权-计划任务提权 操作系统权限提升(二十一)之Linux提权-环境变量劫持提权 SUDO滥用提权 SUDO滥用提权原理 sudo是linux系统管理指令&…

【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序

避坑宝 v1.0.0 基于SpringBootuniapp企业黑红名单吐槽小程序 &#x1f4da;项目介绍 避坑宝 【避坑宝】企业黑红名单吐槽小程序是一个具有吐槽发布企业信息的一个平台&#xff0c;言论自由&#xff0c;评判自定&#xff0c;便于我们打工人分辨企业好坏。技术栈基于SpringBoot…

墨者靶场--报错盲注

引入一下报错注入的知识点&#xff0c;参考【https://www.cnblogs.com/X-caiji/p/13186633.html】 输入测试语句1 and 11--,正常回显 1 and 12-- 无任何报错信息&#xff0c;但是可以确定我们输入的内容确实是被执行了。 那么可以考虑是盲注 一般在实战过程中就需要考虑各种各…

Elasticsearch集成之(Spring Data Elasticsearch)

Elasticsearch集成之&#xff08;Spring Data Elasticsearch&#xff09; 1、Spring Data 框架介绍 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-re…

php宝塔搭建部署实战织梦响应式人力资源网站模板源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的织梦响应式人力资源网站模板源码。感兴趣的朋友可以自行下载学习。 技术架构 PHP7 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#xff0c;宝塔…