题目链接: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. Cannot read property 'apply' of undefined

    ...TypeError: Cannot read property 'apply' of undefined :一般都是作用域不对 ...TypeError: Cannot read propert ...

  2. 开启Qt Lite Project

    发布: http://blog.qt.io/blog/2017/01/23/qt-5-8-released/ 说法一:Qt Lite” is not a tool, but a concept tha ...

  3. Windows Python虚拟环境配置(Distribute + pip + virtualenv + virtualenvwrapper-powershell)

    对于Python开发新手,很多人会迷茫那些各种名目的工具和概念,如Python2.7, Python3.3, Distribute, pip, virtualenv,Setuptools, easy_ ...

  4. PNG透明窗体全攻略(控件不透明)

    http://blog.csdn.net/riklin/article/details/4417247 看好了,这是XP系统,未装.net.我的Photoshop学的不太好,把玻璃片弄的太透了些,如果 ...

  5. 关于 win32 下磁盘的遍历方法

    最近要写个在线专杀的东东,虽然是专杀(本来只要清除几个特定的文件和杀几个特定的进程,然后把用户的注册表恢复正常,很多病毒木马最喜欢干的一件事情就是写 映像劫持 然后机器一重启,安全相关的软件全部玩完了 ...

  6. QT中的SOCKET编程

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  7. 大数据基础之Kafka(1)简介、安装及使用

    kafka2.0 http://kafka.apache.org 一 简介 Kafka® is used for building real-time data pipelines and strea ...

  8. Java项目接入sso单点登录

    最近在落地cat(java开发的一款开源监控系统)接入公司的内部项目,其中有项需求是接入公司的sso单点登录系统.研究了公司之前java项目接入sso系统,大部分是采用spring框架,然后依赖spr ...

  9. spring boot 2.x 系列 —— spring boot 整合 servlet 3.0

    文章目录 一.说明 1.1 项目结构说明 1.2 项目依赖 二.采用spring 注册方式整合 servlet 2.1 新建过滤器.监听器和servlet 2.2 注册过滤器.监听器和servlet ...

  10. python爬虫调用谷歌翻译接口

    2019年7月4日15:53:17 (¦3[▓▓] 晚安 谷歌翻译环境 Python 3.6 第三方库 Execjs (pip install PyExecJS ) 文件列表 同目录下的四个文件: - ...