U460909 [BCSP小高2024T4]先序遍历/小羊的晚餐 题解

news2024/9/22 1:13:58

Part.1 有关本题

本蒟蒻想起这道巧妙 又毒瘤 的题,到处搜寻提交窗口。好不容易找到窗口,有花了 3 h 3h 3h 的时间调题。

本蒟蒻为了悲剧不再发生,于是出了这道题,有写下了这篇题解以供后人。

以下的题解默认以阅读过原题。

Part.2 前置芝士

Part.2-1 DFS序列

DFS序列
DFS序列就是先序遍历的别称,一课子树DFS序列连续

Part.3 题意

言归正传,开始讲题。首先我们说思路,题面中说有一只小羊,它拥有超能力改变某棵二叉树一个节点的父亲。它问最先序遍历最小的字典序。

Part.4 题解

Part.4-1 n^3 暴力

我们枚举一个节点 u u u,新父亲 F F F,将原父亲 f f f 连向 u u u 的边去掉,将 F F F 的一个儿子变为 u u u 即可。更改完毕后对它跑DFS生成答案,取最小字典序。

Part.4-2 转移思路

使用如上所述的DFS序列解题。
转移思路
红是原来的DFS序列,黄操作可以转换为将 [ 8 , 10 ] [8,10] [8,10] 区间( 8 8 8 的子树)前移至 6 6 6 后,绿操作将 [ 9 , 9 ] [9,9] [9,9] 区间后置到 11 11 11 后,紫操作强调了可以放在最后。

但是可以发现,自己和自己的左孩子之间不可以插入区间。

Part.4-4 贪心

考虑前移,那么我们假设有一段区间移动到了 i i i 位置后,那么原来后面的是 i + 1 i+1 i+1,现在变成了某位置 j j j。我们贪心让 j j j 位置小,此时我们移动来了区间 [ j , j + s z j − 1 ] [j,j+sz_j-1] [j,j+szj1] s z sz sz 表示子树大小)。

后置区间 i + 1 i+1 i+1 位置及其子树,那么原来 i i i 位置之后是 i + 1 i+1 i+1,现在变成了 i + 1 + s z i + 1 i+1+sz_{i+1} i+1+szi+1。它的判断是 O ( 1 ) O(1) O(1) 的,可以先判断完。

如果一个为后置的区间 [ l , l + s z l − 1 ] [l,l+sz_l-1] [l,l+szl1] 找到位置,假设插到了 k k k 位置前,那么 k k k 是满足 k k k 位置的值大于 l l l 且它前面可插数的第一个位置。

预处理前面需要的最小值和能否可以插数即可。

Part.5 代码

#include <bits/stdc++.h>
using namespace std;
#define N 100010
int mn[N],id[N],ls[N],rs[N],sz[N],can[N],tot;
void dfs(int u){
	id[++tot]=u; sz[u]=1; 
	if (ls[u]) dfs(ls[u]),sz[u]+=sz[ls[u]];
	if (rs[u]) dfs(rs[u]),sz[u]+=sz[rs[u]];
}void out(int l,int r){
	for (int i=l; i<=r; i++) cout<<id[i]<<" ";
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int t; cin>>t;
	while (t--){
		int n; cin>>n; tot=0; mn[n+1]=1000000;
		for (int i=1; i<=n; i++) cin>>ls[i]>>rs[i];
		dfs(1); int v1,v2,v3,tp=0;
		for (int i=1; i<=n; i++) can[i]=!ls[id[i]];
		for (int i=n; i>=1; i--) mn[i]=min(mn[i+1],id[i]);
		for (int i=1; i<=n; i++){
			if (mn[i+1]<id[i+1]&&can[i]){
				int j=i+1; //cout<<"::"<<i<<" "<<id[i+1]<<" "<<mn[i+1]<<"\n";
				for (;j<=n; j++) if(id[j]==mn[i+1]) break; 
				v1=i+1,v2=j,v3=j+sz[id[j]]; tp=1; 
				//cout<<":::"<<v1<<" "<<v2<<" "<<v3<<"\n";
				break;
			}
		}for (int i=2; i<=n; i++){
			//cout<<":::::"<<sz[id[i]]<<"\n";
			if (i+sz[id[i]]<=n&&id[i+sz[id[i]]]<id[i]&&(i<v1||i==v1&&id[i+sz[id[i]]]<=id[v2]||tp==0)){
				//cout<<"::"<<i<<" "<<i+sz[id[i]]<<"\n";
				v1=i; v2=i+sz[id[i]]; tp=2; v3=n+1; break;
			}
		}if (tp==0) out(1,n);
		else{ 
			if (tp==2){
				for (int j=v2+1; j<=n; j++){
					if (can[j-1]&&id[j]>id[v1]){
						v3=j; break;
					}
				}
			}out(1,v1-1); out(v2,v3-1);
			out(v1,v2-1); out(v3,n);
			//cout<<"\n";
			//cout<<"::"<<v1<<" "<<v2<<" "<<v3<<" "<<tp; 
		}cout<<"\n";
	}
} 

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

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

相关文章

数学建模--禁忌搜索

目录 算法基本原理 关键要素 应用实例 实现细节 python代码示例 总结 禁忌搜索算法在解决哪些具体类型的组合优化问题中最有效&#xff1f; 禁忌搜索算法的邻域结构设计有哪些最佳实践或案例研究&#xff1f; 如何动态更新禁忌表以提高禁忌搜索算法的效率和性能&#…

FPGA开发——数码管数字时钟的设计

一、概述 数码管数字时钟的基本原理是通过内部的计时电路&#xff08;如晶振、分频器、计数器等&#xff09;产生一个稳定的时钟信号&#xff0c;该信号经过处理后被转换为小时、分钟和秒的时间信息。这些信息随后被发送到数码管显示模块&#xff0c;通过控制数码管中不同LED段…

Android读取拨号记录功能

Android读取拨号记录功能 Android读取拨号记录功能 首先会检测应用是否有读取拨号记录的权限 MainActivity.java public class MainActivity extends AppCompatActivity {private ListView listCalls;private List<Map<String, Object>> mapList;private static f…

有界,可积,存在原函数和连续的关系

目录 1.可积和有界的关系 2.连续和可积的关系 3.连续和存在原函数的关系 4.可积和存在原函数没有关系 1.可积和有界的关系 可积必有界&#xff0c;有界不一定可积&#xff0c;反例可以举狄利克雷函数 2.连续和可积的关系 f(x)连续&#xff0c;则一定可积&#xff0c;可积不…

Mac安装nvm以及配置环境变量

安装nvm brew install nvm安装成功后会出现这样一段话: Add the following to your shell profile e.g. ~/.profile or ~/.zshrc:export NVM_DIR"$HOME/.nvm"[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh&q…

Substance Painter界面介绍

1 界面介绍01_哔哩哔哩_bilibili 界面 选择texture 笔刷参数 分成不同的材质球 选择不同工具跟着变动 p4

STL序列式容器之list的使用及实现

std::list 和 std::vector 是两种不同的数据结构&#xff0c;std::vector 是基于数组的动态数组&#xff0c;而 std::list 是基于双向链表的数据结构。list适用于需要在序列中频繁执行插入和删除操作的场景。 1.list的特性 双向链表&#xff1a; list是一个双向链表&#xff…

R 语言学习教程,从入门到精通,R的安装与环境的配置(3)

1、R 基础语法 一门新的语言学习一般是从输出 “Hello, World!” 程序开始&#xff0c;R 语言的 “Hello, World!” 程序代码如下&#xff1a; myString <- "Hello, World!" print ( myString )以上示例将字符串 “Hello, World!” 赋值给 myString 变量&#x…

【hive】HiveSQL中两个json解析函数的使用json路径定位小工具

文章目录 1.HiveSQL中两个json解析函数1&#xff09;get_json_object2&#xff09;json_tuple 2.json中key所在层级路径定位小工具 关于json&#xff1a; https://blog.csdn.net/atwdy/article/details/124668815 1.HiveSQL中两个json解析函数 1&#xff09;get_json_object …

使用 Squid 搭建 Http 代理服务器隐藏 IP

在一些情况下&#xff0c;需要变更自己的访问 IP&#xff0c;可以通过 Squid 搭建代理服务器实现。 本文使用的是 CentOS 7.6 系统。 一、部署 Squid 安装 Squid。 yum install squid -y启动服 systemctl start squid二、访问控制 总有刁民想害郑&#xff0c;疯狂访问朕的…

C++ 最小生成树 洛谷

介绍&#xff1a; 最小生成树是个啥&#xff1f;其实就像杨志一行人押送生辰纲。抛开最后生辰纲被抢的结局不谈&#xff0c;杨志他们需要到好几个地方&#xff0c;每个地方都需要花点过路费给梁山好汉们打点。比如下面就是一张城市地图&#xff1a; 其中每两个图之间的路径长就…

【保姆级系列:锐捷模拟器的下载安装使用全套教程】

保姆级系列&#xff1a;锐捷模拟器的下载安装使用全套教程 1.介绍2.下载3.安装4.实践教程5.验证 1.介绍 锐捷目前可以通过EVE-NG来模拟自己家的路由器&#xff0c;交换机&#xff0c;防火墙。实现方式是把自己家的镜像导入到EVE-ng里面来运行。下面主要就是介绍如何下载镜像和…

【Unity】3D功能开发入门系列(三)

Unity3D功能开发入门系列&#xff08;三&#xff09; 一、运动脚本&#xff08;一&#xff09;物体的运动&#xff08;二&#xff09;相对运动&#xff08;三&#xff09;运动的方向 二、旋转脚本&#xff08;一&#xff09;物体的旋转&#xff08;二&#xff09;相对旋转&…

图像相关的基础知识【RGB和RGBA】—附python代码实现

文章目录 1、图像基础知识2、像素和通道的理解3、RGB和RGBARGB (Red, Green, Blue)RGBA (Red, Green, Blue, Alpha)应用场景 4、H,W,C5、小结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#x…

aurora8b10b ip的使用(framing接口下的数据回环测试)

文章目录 一、Aurora8B/10B协议二、时钟、复位与状态指示1、时钟2、复位3、状态指示 三、数据发送、接受接口&#xff08;1&#xff09;AXI4-Stream位排序&#xff08;2&#xff09;Streaming接口&#xff08;3&#xff09;Framing接口&#xff08;帧传输接口&#xff09; 四、…

C++ | Leetcode C++题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; class Solution { public:int bulbSwitch(int n) {return sqrt(n 0.5);} };

Python | Leetcode Python题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; class Solution:def maxProduct(self, words: List[str]) -> int:masks defaultdict(int)for word in words:mask reduce(lambda a, b: a | (1 << (ord(b) - ord(a))), word, 0)masks[mask] max(masks[mask], len(word))return…

索引:SpringCloudAlibaba分布式组件全部框架笔记

索引&#xff1a;SpringCloudAlibaba分布式组件全部框架笔记 一推荐一套分布式微服务的版本管理父工程pom模板&#xff1a;Springcloud、SpringCloudAlibaba、Springboot二SpringBoot、SpringCloud、SpringCloudAlibaba等各种组件的版本匹配图&#xff1a;三SpringBoot 3.x.x版…

字符串相关函数

文章目录 &#x1f34a;自我介绍&#x1f34a;strcpy 字符串拷贝函数&#x1f34a;strcat 字符串连接函数&#x1f34a;strlen 字符串长度计算函数&#x1f34a;strcmp 字符串比较函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&…

C++ | Leetcode C++题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProduct(vector<string>& words) {unordered_map<int,int> map;int length words.size();for (int i 0; i < length; i) {int mask 0;string word words[i];int wordLength word.s…