团体程序设计天梯赛 决赛 L3 是否完全二叉搜索树

题目链接:https://www.patest.cn/contests/gplt/L3-010

相信很多人跟小编一样,比赛的时候就算这是一道中文题也不知道这是什么意思,因为对二叉搜索树的概念知道的比较少,对着中文题就跟对着英文题一个感受 _(:з」∠)_,下来一直到题意了,就发现,这道题其实超级简单。

题意是这样的,二叉搜索树,建立的时候秉持着一种大的在左边,小的在右边的原则,每一次插入都放到适合的位置,比如现在的状态是:


现在我们要插入7的话,从根节点开始,7>3,在左子树,7>5,又在左子树,7>6,又在左子树,所以7的位置就是这样:


接下来就是判断是否是完全二叉搜索树,在上面建树的时候小编我采取的是对编号进行离散化,左子树的编号是根节点的2倍,右子树的编号是结点的2倍+1,如果是完全二叉树,那么一定是编号都是从1~n,那么这样的话只要我们最后遍历一次,在1~n之间没有出现没有的情况,就好了。

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 30;
int a[maxn],tree[maxn];
map<int, int> Map;
int main()
{
	int n,num=1,r=1;
	scanf("%d", &n);
	scanf("%d", &a[0]);
	Map[r] = num++;
	tree[Map[r]] = a[0];
	for(int i=1; i<n; i++)
	{
		scanf("%d", &a[i]);
		r = 1;
		while(Map[r])
		{
			if(a[i] > tree[Map[r]]) r = r<<1;
			else r = r<<1|1;
		}
		Map[r] = num++;
		tree[Map[r]] = a[i];
	}
	int ok = 0;
	printf("%d", a[0]);
	for(int i=2; i<=31; i++)
	{
		if(Map[i]) printf(" %d", tree[Map[i]]);
		else if(i <= n) ok = 1;
	}
	if(ok) printf("\nNO\n");
	else printf("\nYES\n");
}


### 团体程序设计天梯赛 L3 级别题目解析 团体程序设计天梯赛(GPLT)中的 L3 级别通常涉及较复杂的算法和数据结构应用,考察参赛者综合编程能力。以下是基于提供的引用内容对 L3 级别的部分题目及相关规则的分析。 #### 题目一:夺宝大赛 此题要求在一维数组中寻找满足特定条件的子矩阵数量[^1]。具体来说: - **输入**:两个整数 `n` 和 `k` 表示矩阵大小与目标值。 - **输出**:符合条件的子矩阵总数。 实现该功能的核心在于高效遍历所有可能的子矩阵并统计其总和等于目标值的数量。可以采用前缀和优化来降低时间复杂度至 O(n²)[^1]。 ```python def count_matrices_with_sum_k(matrix, k): m, n = len(matrix), len(matrix[0]) prefix_sums = [[0]*(n+1) for _ in range(m+1)] # 计算二维前缀和 for i in range(1, m+1): for j in range(1, n+1): prefix_sums[i][j] = matrix[i-1][j-1] + \ prefix_sums[i-1][j] + \ prefix_sums[i][j-1] - \ prefix_sums[i-1][j-1] result = 0 # 枚举矩形区域 from collections import defaultdict for top in range(1, m+1): for bottom in range(top, m+1): sum_freq = defaultdict(int) sum_freq[0] += 1 for col in range(1, n+1): current_sum = prefix_sums[bottom][col] - \ prefix_sums[top-1][col] if (current_sum - k) in sum_freq: result += sum_freq[current_sum-k] sum_freq[current_sum] += 1 return result ``` --- #### 题目二:吕严 vs 土豆 这道题目通过简单的逻辑运算验证两者的计算方式是否一致[^2]。核心思路如下: - 给定三个参数 A、B 和 C,分别表示初始数值、加法次数以及最终结果。 - 判断是否存在一种解释使得 `(A * B)` 或 `(A + B)` 的结果匹配 C 值。 代码实现较为简单,只需逐一尝试两种可能性即可得出结论。 ```python def check_comedy_math(a, b, c): method_yan = a * b == c method_tu = a + b == c return ("Both" if method_yan and method_tu else "Yan" if method_yan else "Tu" if method_tu else "Neither") ``` --- #### 题目三:长城问题 对于更复杂的几何类问题如“长城”,需要处理大量坐标点之间的关系,并找出最优路径或面积等属性[^3]。主要步骤包括但不限于以下几点: - 使用凸包算法求解包围整个顶点集合所需的最小周长; - 距离公式用于精确测量任意两点间欧几里得距离; - 动态规划方法解决多阶段决策过程中的最短路/最长链等问题。 由于此类问题往往伴随较高的时空需求,在实际编码过程中需特别关注效率提升策略,比如剪枝技术的应用或者近似解代替完全枚举方案。 --- ### 比赛规则概述 L3级别比赛强调团队协作和个人实力相结合,选手们不仅要在规定时间内完成高质量解答,还需合理分配精力应对不同难度层次的任务挑战。评分标准一般依据提交正确率及时限长短决定得分高低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值