洛谷 P5018 对称二叉树(搜索)】的更多相关文章

给一手链接 https://www.luogu.com.cn/problem/P5018 这道题其实就是用hash水过去的,我们维护两个hash 一个是先左子树后右子树的h1 一个是先右子树后左子树的h2 如果一个点,他的左子树的h1==右子树的h2 那么以这个点为根的树就是对称二叉树了 TIPS:hash的顺序至关重要! #include<cstdio> #include<iostream> #include<cstring> #include<algorith…
不多扯题目 直接题解= = 1.递归 由题目可以得知,子树既可以是根节点和叶节点组成,也可以是一个节点,题意中的对称二叉子树是必须由一个根节点一直到树的最底部所组成的树. 这样一来就简单了,我们很容易就能想到用递归的方法 1.枚举根节点,判断其左右两个孩子节点 是否存在 以及是否相等. 若存在并且点权相等,则一直递归左右两个孩子节点的左右两个孩子节点 . 重复上述判断. 2.判断好对称二叉树后,就可以计算以该节点为根节点的对称二叉子树的节点数量并取最优值了. #include<iostream>…
嗯... 题目链接:https://www.luogu.org/problem/P5018 其实这道题直接搜索就可以搜满分: 首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点的那棵子树是不是对称的,然后在对称的子树中记录最大值. AC代码: #include<cstdio> #include<iostream> using namespace std; struct node{ int l, r, v, len; node() {l = -; r = -;…
题目链接:https://www.luogu.org/problemnew/show/P5018 花絮:这道题真的比历年的t4都简单的多呀,而且本蒟蒻做得出t4做不出t3呜呜呜... 这道题可以是一只披着狼皮的羊了,全篇字字不离树,二叉树,然鹅却只需要会搜索就能解决. 在前些日子复习的时候并没有考虑的普及组会出于数据结构有关的题目,于是大多数时间只是放在搜索,模拟,简单dp上,只为了以防不测练了个dijkstra模板,考试时看到了这题果断骗分,结果敲完后去了趟厕所才发现搜索跑个'暴力'也行啊,至…
话说这图也太大了吧 这题十分的简单,我们可以用两个指针指向左右两个对称的东西,然后比较就行了 复杂度O(n*logn) #include<bits/stdc++.h> using namespace std; inline int read() { ,w=; char c=getchar(); ') { if (c=='-') { w=-; } c=getchar(); } ') { X=(X<<)+(X<<)+c-'; c=getchar(); } return X*…
题目传送门 解题思路: 先计算每个点的子树有多少节点,然后判断每个子树是不是对称的,更新答案. AC代码: #include<iostream> #include<cstdio> using namespace std; struct kkk{ int l,r,v,len; kkk() {l = -;r = -;} }e[]; int n,ans; bool solve(int ls,int rs) { ; if(e[ls].v != e[rs].v) return false;…
2021.08.09 P5018 对称二叉树(树形结构) [P5018 NOIP2018 普及组] 对称二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 求一棵子树,关于该子树根节点轴对称的节点数最大. 分析: 暴力. 代码如下: 40tps #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int N=1e6+10; in…
洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然发现了一个0提交0通过的题目,然后就引发了整个机房的兴趣,,然后,,就变成了16提交7通过,, 初看上去这题目就是记忆化搜索,但是环的存在使得普通的记忆化会导致漏解,继续观察发现整张图为n个点n条边,即是多个基环外向树,使用tarjan找到图中的环,显然可知,对于环上一点,能取到的最大值是环的长度,…
题目大意:定义对称二叉树为每个节点的左右子树交换后与原二叉树仍同构的二叉树,求给定的二叉树的最大对称二叉子树的大小. 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; struct node{ int l,r,size,val; }t[maxn]; int n,ans; void read_and_parse(){ scanf("%d",&n); for(int i=1…
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师)的掌握程度 考完试有人说这题是马拉车,吓死我了 首先,你把数据读入之后,先用一个大法师把以每个节点为根的子树的大小和权值都预处理出来,方便待会剪枝 然后,你对以每个节点为根的子树,都判断一下以下条件(这时刚才处理的东西就有用了) ① 左子树和右子树的节点数是否相等 ② 左子树和右子树的权值是否相等…