题目链接:https://www.luogu.org/problemnew/show/P5018

花絮:这道题真的比历年的t4都简单的多呀,而且本蒟蒻做得出t4做不出t3呜呜呜。。。

这道题可以是一只披着狼皮的羊了,全篇字字不离树,二叉树,然鹅却只需要会搜索就能解决。

在前些日子复习的时候并没有考虑的普及组会出于数据结构有关的题目,于是大多数时间只是放在搜索,模拟,简单dp上,只为了以防不测练了个dijkstra模板,考试时看到了这题果断骗分,结果敲完后去了趟厕所才发现搜索跑个‘暴力’也行啊,至少即便T了也多A几个点。

写到只剩30分钟是才过了全部样例,测了两三个卡自己的也过了,于是转颓T3,居然发现把30分的骗分写炸了。。。

下面进入正题。

分析:

考虑到我们可以从节点1(即树根开始搜索),dfs,搜到一个点先判断它存不存在,如果存在,先把他的两个子节点都搜上。然后开个c数组记录当前最大的节点数,当然权值也要累加,为了之后作为判断条件之一,然后我们尝试用c[i]更新答案,条件是必须大于当前答案,并且两个子节点形成对称,即可。主题思路已经讲出,接下来在代码中注释。

代码:

#include<cstdio>
using namespace std;
int v[1000005],ch[1000005][2],c[1000005],n,ans;
bool same(int a,int b)//判断两节点是否对称
{
if(a==b)return 1;
if(!a||!b)return 0;
return v[a]==v[b]&&same(ch[a][1],ch[b][2])&&same(ch[a][2],ch[b][1]);
}
void dfs(int i)//大法师搜索
{
if(!i)return;
dfs(ch[i][1]);
dfs(ch[i][2]);
c[i]=1+c[ch[i][1]]+c[ch[i][2]];
v[i]=v[i]+v[ch[i][1]]+v[ch[i][2]];
if(ans<c[i]&&same(ch[i][1],ch[i][2]))ans=c[i];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&v[i]);
v[0]=1005;
for(int i=1;i<=n;i++)
for(int k=1;k<=2;++k)
{
scanf("%d",&ch[i][k]);
if(ch[i][k]==-1)ch[i][k]=0;//清为0,好判断
}
dfs(1);
printf("%d",ans);
return 0;//the end
}
~完结✿✿ヽ(°▽°)ノ✿

注:此代码并非蒟蒻考场所写

NOIP2018普及T4暨洛谷P5018 对称二叉树题解的更多相关文章

  1. NOIP2018普及T1暨洛谷P5015 标题统计 题解

    题目链接:https://www.luogu.org/problemnew/show/P5015 分析: 这道题大概是给个签到分吧.很显然的字符串操作.本篇题解主要帮助初学者,请大佬略过. 首先给大家 ...

  2. 洛谷P5018 对称二叉树——hash

    给一手链接 https://www.luogu.com.cn/problem/P5018 这道题其实就是用hash水过去的,我们维护两个hash 一个是先左子树后右子树的h1 一个是先右子树后左子树的 ...

  3. 洛谷P5018 对称二叉树

    不多扯题目 直接题解= = 1.递归 由题目可以得知,子树既可以是根节点和叶节点组成,也可以是一个节点,题意中的对称二叉子树是必须由一个根节点一直到树的最底部所组成的树. 这样一来就简单了,我们很容易 ...

  4. NOIP2018普及T2暨洛谷P5016 龙虎斗

    题目链接:https://www.luogu.org/problemnew/show/P5016 分析: 这是一道模拟题.看到题目,我们首先要把它细致的读明白,模拟题特别考察细节,往往会有想不到的坑点 ...

  5. 洛谷 P5018 对称二叉树

    题目传送门 解题思路: 先计算每个点的子树有多少节点,然后判断每个子树是不是对称的,更新答案. AC代码: #include<iostream> #include<cstdio> ...

  6. 洛谷 P5018 对称二叉树(搜索)

    嗯... 题目链接:https://www.luogu.org/problem/P5018 其实这道题直接搜索就可以搜满分: 首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点 ...

  7. 【洛谷P5018 对称二叉树】

    话说这图也太大了吧 这题十分的简单,我们可以用两个指针指向左右两个对称的东西,然后比较就行了 复杂度O(n*logn) #include<bits/stdc++.h> using name ...

  8. P5018 对称二叉树题解

    题目内容链接: 那么根据题意,上图不是对称二叉树,只有节点7的子树是: 通俗来说,对称二叉树就是已一个节点x为根的子树有穿过x点的对称轴并且对称轴两边的对称点的大小也必须相等,那么这棵树就是对称二叉树 ...

  9. 洛谷P1040 加分二叉树题解

    dp即可 \(f[i][j]\)表示i到j的加分 相当于区间dp了 #include<cstdio> using namespace std; int v[50]; int f[55][5 ...

随机推荐

  1. Web页面制作之开发调试工具

    直击现场 <HTML开发MacOSApp教程>  http://pan.baidu.com/s/1jG1Q58M 开发工具介绍 开发工具一般分为两种类型:文本编辑器和集成开发环境(IDE) ...

  2. QThread多线程编程经典案例分析(三种方法,解释了为什么使用moveToThread的根本原因,即为了避免调用QThread::exec() )

    传统的图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应. 一个解决方法是按照事件处理的思路: 调用 Void QApplication::pr ...

  3. 安装mysql apache php smb

    1 SMB LinuX下SMB的配置 使用Smb进行连接的命令: smbclient //192.168.128.1/Share 今天要在LINUX之间以及LINUX与WINDOWS之间互相传送文件, ...

  4. Python将pyc转为py

    安装pip install uncompyle2, 使用uncompyle2 xxx.pyc > xxx.py

  5. Python开发【第九篇】: 并发编程

    内容概要 操作系统介绍 进程 线程 协程 二. 进程 python并发编程之多进程理论部分 在python程序中的进程操作 运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...

  6. 如何判断/检查一个集合(List<string>)中是否有重复的元素

    问题描述 在.NET/C#应用程序编程开发中,如何判断一个字符串集合List<string>中是否有重复的元素? 假如有如下的List<string>集合: var lstNa ...

  7. C# 连接数据库等

    SqlConnection连接池:可以通过连接字符串配置连接池.对象池技术:HttpApplication :Asp.Net生产者 消费者. 线程.应用程序跟数据连接非常耗时,而且连接使用非常频繁,使 ...

  8. Java中字符串的一些常用操作方法

      package test; public class  maintest {public static void main(String[] args) {String str = "a ...

  9. Windows和linux环境下按文件名和字符串搜索命令

    Windows 1.遍历C盘下所有txt 命令:for /r c:\ %i in (*.txt) do @echo %i 注释:for 循环的意思 /r 按照路径搜索 c:\ 路径 %i in   ( ...

  10. Codeforces 755D:PolandBall and Polygon(思维+线段树)

    http://codeforces.com/problemset/problem/755/D 题意:给出一个n正多边形,还有k,一开始从1出发,向第 1 + k 个点连一条边,然后以此类推,直到走完 ...