NOIP2018 普及组 T4 对称二叉树

文章目录

  • 题目传送门
  • 算法解析
  • 总代码
  • 提交记录
  • 尾声

题目传送门

洛谷 P5018 [NOIP2018 普及组] 对称二叉树

算法解析

本题 DFS + 剪枝可过!!!

输入左儿子右儿子时如果遇到 − 1 -1 1 就把它设为 0 0 0,这样好判断。

输入函数:

void inp() {scanf("%d", &n);for(int i = 1; i <= n; ++i)scanf("%d", &w[i]);for(int i = 1; i <= n; ++i) {scanf("%d%d", &le[i], &rt[i]);if(le[i] == -1)le[i] = 0;if(rt[i] == -1)rt[i] = 0;}
}

然后计算出所有子树的结点个数,方便剪枝和跟新答案:

void dfs1(int u) {if(!u)return;dfs1(le[u]);dfs1(rt[u]);cnt[u] = cnt[le[u]] + cnt[rt[u]] + 1;
}

然后就是计算答案了,我们先写一个函数 bool check(int u, int v),就是判断以 u u u 结点为根结点的子树和以 v v v 结点为根结点的子树是否对称,这里有很多剪枝,但都很简单,相信大家都能看懂:

void bemax(int &a, int b) {a = a > b ? a : b;
}bool check(int u, int v) {if(!u && !v)return true;if(!u || !v)return false;if(w[u] != w[v])return false;if(cnt[u] != cnt[v])return false;return check(le[u], rt[v]) & check(rt[u], le[v]);
}

有了这个函数,就很好计算答案了:

void dfs2(int u) {if(!u)return;if(check(le[u], rt[u]))bemax(ans, cnt[u]);dfs2(le[u]);dfs2(rt[u]);
}

最后再输出一下 a n s ans ans 就可以了,这样我们就 A(shui)掉了此题。

总代码

#include <cstdio>
using namespace std;const int N = 1e6 + 5;int n;
int w[N];
int le[N], rt[N];
int cnt[N];
int ans;void bemax(int &a, int b) {a = a > b ? a : b;
}bool check(int u, int v) {if(!u && !v)return true;if(!u || !v)return false;if(w[u] != w[v])return false;if(cnt[u] != cnt[v])return false;return check(le[u], rt[v]) & check(rt[u], le[v]);
}void dfs1(int u) {if(!u)return;dfs1(le[u]);dfs1(rt[u]);cnt[u] = cnt[le[u]] + cnt[rt[u]] + 1;
}void dfs2(int u) {if(!u)return;if(check(le[u], rt[u]))bemax(ans, cnt[u]);dfs2(le[u]);dfs2(rt[u]);
}void inp() {scanf("%d", &n);for(int i = 1; i <= n; ++i)scanf("%d", &w[i]);for(int i = 1; i <= n; ++i) {scanf("%d%d", &le[i], &rt[i]);if(le[i] == -1)le[i] = 0;if(rt[i] == -1)rt[i] = 0;}
}void work() {dfs1(1);dfs2(1);printf("%d\n", ans);
}int main() {inp();work();return 0;
}

提交记录

AC 记录

尾声

如果这篇博客对您(您的团队)有帮助的话,就帮忙点个赞,加个关注!

最后,祝您(您的团队)在 OI 的路上一路顺风!!!

┬┴┬┴┤・ω・)ノ ByeBye

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

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

相关文章

布隆过滤器简介

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率高、查询效率快的数据结构&#xff0c;用于快速判断一个元素是否可能存在于一个集合中。它通过使用多个哈希函数和位数组来实现。 布隆过滤器原理&#xff1a; 位数组&#xff08;Bit Array&#xff09;&#xf…

【力扣 Hot100 | 第六天】4.21(字母异位词分组)

9.字母异位词分组 9.1题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例一&#xff1a; 输入: strs ["eat", "tea", "tan&quo…

C语言oj题

题目 &#xff1a;保留小数 难度&#xff1a;白银 将一个浮点型K数保留n(1≤n≤5)位小数(四舍五入)的算法定义为宏。在主函数中输入数据输出计算结果。 格式 输入格式&#xff1a;输入k为实型&#xff0c;n为整数&#xff0c;空格分隔。 输出格式&#xff1a;输出为实型 样例1…

vue3中插槽的使用与用处

在Vue 3中&#xff0c;插槽&#xff08;slot&#xff09;是一种强大的机制&#xff0c;它允许开发者在父组件中向子组件传递内容&#xff0c;从而增强组件的灵活性和可重用性。插槽的使用和用处主要体现在以下几个方面&#xff1a; 使用方式&#xff1a; 默认插槽&#xff1a…

电商技术揭秘三十二:智能风控的案例研究与未来趋势

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

stable diffusion webui 使用 SDXL模型

可以去c站上下载别人处理好的模型&#xff0c;从liblib里下载也可以 DreamShaper XL 将下载好的模型复制到/models/Stable-diffusion目录下&#xff0c;webui的界面里选择加载模型 测试了一下&#xff0c;需要注意的是这三个选项 采样器必须设置为DPM SDE Karras &#xf…

spring高级篇(三)

1、Spring选择代理 1.1、Aspect和Advisor 在Spring框架中&#xff0c;"Aspect" 和 "Advisor" 是两个关键的概念&#xff0c;它们都与AOP&#xff08;面向切面编程&#xff09;密切相关&#xff1a; 如果要在Spring中定义一个Aop类&#xff0c;通常会&…

STM32H7的LCD控制学习和应用

STM32H7的LCD控制 LTDC基础硬件框图LTDC时钟源选择LTDC的时序配置LTDC背景层、图层1、图层2和Alpha混合LTDC的水平消隐和垂直消隐LCD的DE同步模式和HV同步模式的区别区分FPS帧率和刷新率避免LTDC刷新撕裂感的解决方法 驱动示例分配栈的大小MPU和Cache配置初始化SDRAM初始化LCD应…

镜头光晕-Unity镜头光晕组件的使用

Unity中的镜头光晕组件是一种用于增强游戏画面效果的特效组件。它可以在镜头周围创建出光晕效果&#xff0c;使画面更加柔和和浪漫。下面是使用Unity镜头光晕组件的步骤&#xff1a; 在Unity编辑器中&#xff0c;选择你想要添加光晕效果的摄像机对象。在Inspector面板中&#…

SAP Fiori开发中的JavaScript基础知识16 - 用JavaScript实现ABAP的内表效果

1. ABAP内表 内表是ABAP编程过程中最常用的一种数据类型&#xff0c;下面是一个简单的内表程序&#xff0c;也即使用内表存储多个“人名数据”。 先定义结构ts_person&#xff0c;并基于结构定义内表变量lt_people&#xff0c;然后通过insert语句为内表赋值。 REPORT ztest_…

使用IOPaint实现图片擦除路人

IOPaint 是一个免费的开源的 inpainting/outpainting 工具&#xff0c;由最先进的 AI 模型提供支持。 IOPaint 中使用各种模型来修改图像&#xff1a; 擦除&#xff1a;删除任何不需要的物体、缺陷、水印、人物。修复&#xff1a;对图像的特定部分进行修改、添加新对象或替换…

vcontact2:病毒聚类(失败)

Bitbucket 安装 mamba create --name vContact2 biopython1.78 mamba install -c bioconda vcontact20.11.3vim ~/envs/vContact2/lib/python3.9/site-packages/vcontact2/exports/summaries.py 把 np.warnings.filterwarnings(ignore) 改成 import warnings warnings.filte…

Java虚拟机类加载机制详细总结

1、概述 Java虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这个过程被称作虚拟机的类加载机制。 2、类加载的时机 一个类型从被加载到虚拟机内存中开始&#xff…

Linux系统使用命令来查看本地端口的使用情况

Linux系统使用命令来查看本地端口的使用情况 netstat 命令&#xff1a; netstat 是一个显示网络连接、路由表、接口统计信息等的工具。要查看端口使用情况&#xff0c;可以使用以下命令&#xff1a; netstat -tunlp这里&#xff0c;选项的含义如下&#xff1a; -t 表示显示TCP端…

浅析Java中的LinkedList和ArrayList特点和底层

本期经验 LinkedList适合于删除和插入元素的操作&#xff0c;对首元素和尾元素的删除和修改插入极好&#xff0c;ArrayList适合于元素的修改和查询。 LinkedList LinkedList的底层使用双向链表来写&#xff0c;这导致其每次查询和修改元素都必须从首元素开始以此往下找&…

数据结构与算法-砖墙问题

砖墙问题 你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同&#xff08;也就是一个单位高&#xff09;但是宽度不同。每一行砖块的宽度之和相等。 你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过&#xff0c;就不算穿过…

ZooKeeper的分布式锁

ZooKeeper的分布式锁机制主要利用ZooKeeper的节点特性&#xff0c;通过创建和删除节点来实现锁的控制。 实现步骤&#xff1a; 创建锁节点&#xff1a;当一个进程需要访问共享资源时&#xff0c;它会在ZooKeeper中创建一个唯一的临时顺序节点作为锁。尝试获取锁&#xff1a;进…

视频评价工具AVQT介绍

AVQT介绍 AVQT(Advanced Video Quality Tool)是一个用于评估压缩视频感知质量的工具。它通过模拟人类如何评价压缩视频的质量来进行工作。AVQT 是是苹果在 WWDC 21 上推出的一款评估视频感知质量的工具。AVQT可以用于计算视频的帧级和片段级得分,其中片段通常持续几秒钟。这…

javaScript设计模式之原型模式

我们创建的每个函数都有一个prototype(原型)属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象&#xff0c;而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。字面意思来理解&#xff0c;那么prototype就是通过调用构造函数而创建的那个对象实例的…

开曼群岛:Web3企业的乐园

开曼群岛&#xff1a;Web3企业的理想之地 开曼群岛&#xff0c;在数字革命中大放异彩。近年来&#xff0c;该地区成立的Web3企业数量显著增加&#xff0c;如果保持目前的发展速度&#xff0c;并持续优化立法&#xff0c;那么扩展的速度将无可限量。本文将探讨推动这一增长的关…