首页 > 其他分享 >树状数组-三色二叉树 题解

树状数组-三色二叉树 题解

时间:2024-02-16 17:55:24浏览次数:30  
标签:zl cnt ch return 树状 int 题解 二叉树

题目在这里
————————————————————————————————

三色二叉树

首先 题面写的很清楚了 是一道树状数组题
因为这题的输入方式很特别 按二叉树序列 所以在输入上要特殊处理
如下

void read(int x)
{//读入+存图 以左右子树为形式 如l[x]=y即y为x左子树 
	char ch=getchar();
	if(ch=='0')return;
	l[x]=++cnt;
	read(cnt);
	if(ch=='2')
	{
		r[x]=++cnt;
		read(cnt);
	}
}

以字符形式读入 同时建好了左右子树图 比起整体读入再处理的方法便捷很多

然后 是简单的利用dfs遍历最大值和最小值的操作
状态转移方程如下:

zl[x][1]=zl[l[x]][0]+zl[r[x]][0]+1;
zl[x][0]=max(zl[l[x]][0]+zl[r[x]][1],zl[l[x]][1]+zl[r[x]][0]);

有注释 不再多言

void DrRatio(int x)//最大值 dfs 
{
	if(!x)return;
	DrRatio(l[x]);
	DrRatio(r[x]);
	zl[x][1]=zl[l[x]][0]+zl[r[x]][0]+1;
	zl[x][0]=max(zl[l[x]][0]+zl[r[x]][1],zl[l[x]][1]+zl[r[x]][0]);
	//三者颜色必定不同 故若x不染色 l[x] r[x]必定有其一染色
	//同理若x染色 则l[x] r[x] 必定不染色 
}
void Silwolf(int x)//最小值 
{
	if(!x)return;
	Silwolf(l[x]);
	Silwolf(r[x]);
	zl[x][1]=zl[l[x]][0]+zl[r[x]][0]+1;
	zl[x][0]=min(zl[l[x]][0]+zl[r[x]][1],zl[l[x]][1]+zl[r[x]][0]); 
}

最后就是很简单的输出

总结一下 这道题难点就在于清晰地认识到填色方法 以及将输入数据处理成图的操作
(还有 记得置零

code:

点击查看代码
#include <bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
#define foo(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
using namespace std;
inline int qr()
{
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#define qr qr()
typedef long long ll;
const int Ratio=0;
const int N=100005;
const int maxx=0x7f7f7f7f;
ll zl1,zl2,cnt=1;
ll zl[N][5],l[N],r[N];//zl[i][0] 第i块不染色 。。[1]染色 
void read(int x)
{//读入+存图 以左右子树为形式 如l[x]=y即y为x左子树 
	char ch=getchar();
	if(ch=='0')return;
	l[x]=++cnt;
	read(cnt);
	if(ch=='2')
	{
		r[x]=++cnt;
		read(cnt);
	}
}
void DrRatio(int x)//最大值 dfs 
{
	if(!x)return;
	DrRatio(l[x]);
	DrRatio(r[x]);
	zl[x][1]=zl[l[x]][0]+zl[r[x]][0]+1;
	zl[x][0]=max(zl[l[x]][0]+zl[r[x]][1],zl[l[x]][1]+zl[r[x]][0]);
	//三者颜色必定不同 故若x不染色 l[x] r[x]必定有其一染色
	//同理若x染色 则l[x] r[x] 必定不染色 
}
void Silwolf(int x)//最小值 
{
	if(!x)return;
	Silwolf(l[x]);
	Silwolf(r[x]);
	zl[x][1]=zl[l[x]][0]+zl[r[x]][0]+1;
	zl[x][0]=min(zl[l[x]][0]+zl[r[x]][1],zl[l[x]][1]+zl[r[x]][0]); 
}
void op()
{
	printf("%lld %lld\n",zl1,zl2);
}
int main()
{
	read(cnt);
	memset(zl,0,sizeof zl);
	DrRatio(1);
	zl1=max(zl[1][1],zl[1][0]);
	memset(zl,0,sizeof zl);
	Silwolf(1);
	zl2=min(zl[1][1],zl[1][0]);
	op();
	return Ratio;
}

标签:zl,cnt,ch,return,树状,int,题解,二叉树
From: https://www.cnblogs.com/DrRatio-DanhengYinyue1007/p/18017343

相关文章

  • [Vijos P1448] 校门外的树 题解
    题目描述校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作:k==1,读入l,r表示在l到r之间种上一种树,每次操作种的树的种类都不同;k==2,读入l,r表示询问l到r之间有多少种树。注意:每个位置都可以重复种树。......
  • CF55D Beautiful numbers 题解
    题目链接:CF或者洛谷常见知识点组合经典题。首先,一眼数位dp类型题,考虑需要处理些怎样的判断合法数位信息。经典操作对于跟整除有关的判断,数位dp为了减少使用空间,都可以考虑记忆化模数减少空间开销。对于整除若干个数,即整除这若干个数的最小公倍数即可,是一个非常常用......
  • 【题解】P4722 【模板】最大流 加强版 / 预流推进
    更好阅读体验CHAPTER0废话1.常见的最大流算法可以大致分为两种:找增广路和预流推进2.从理论时间复杂度上界来看,找增广路算法的最坏时间复杂度为\(O(n^2m)\),而预流推进算法的最坏时间复杂度为\(O(n^2\sqrt{m})\),看起来预流推进要显然优于找增广路,但在实际应用(尤指OI)中,由于包......
  • HDU-Employment Planning题解
    题目在这里————————————————————————————————EmploymentPlanning简单的一道dp关键的点在于想到用枚举实现各种情况的讨论关键的注释写在代码里了还是很清晰的捏~#include<bits/stdc++.h>#definefo(x,y,z)for(int(x)=(y);(x)<=(z);(x......
  • 题解 LGP10144【[WC/CTS2024] 水镜】
    题解P10144【[WC/CTS2024]水镜】题目描述给定一个长度为\(n\)的正整数序列\(h_1,h_2,\cdots,h_n\),求满足以下所有条件的二元组\((u,v)\)的数量:\(1\leu<v\len\),且\(u,v\)为整数;存在一个正实数\(L\)以及一个长度为\((v-u+1)\)的序列\(r_u,r_{u+......
  • Codeforces Round 926 (Div. 2) 题解
    比赛链接:https://codeforces.com/contest/1929官解链接:https://codeforces.com/blog/entry/125943出的很差的一场。推歌CF1929A.SashaandtheBeautifulArray题意任意排列数组\(a_{1..n}\),求\(\sum_{i=2}^n(a_i-a_{i-1})\)的最大值。题解见过最显然的A题,奠定了......
  • HH的项链 题解
    题目描述HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。......
  • 盖房子 题解
    题目描述永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING_),他想在这块土地上建造一所房子,这个房子必须是正方形的。但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。这些瑕疵十分恶心,以至于根本不能在上面盖一砖一瓦。他希望找到一块最大的正方形无瑕疵土......
  • 三角蛋糕 题解
    题目描述XP在机房里放了一块正三角形的大蛋糕,但是第二天他发现蛋糕被老鼠咬坏了。XP不想让蛋糕白白的被浪费,于是他把蛋糕分割成了一个个的小正三角形(如上图所示)。黑色的小正三角形表示老鼠把那一块咬坏了。XP想要切出一块最大的没被老鼠咬坏正三角形的蛋糕,可是最大的三角形有多......
  • (18/60)找树左下角的值、路径总和、从中序与后序遍历构造二叉树
    找树左下角的值leetcode:513.找树左下角的值层序迭代法思路层序遍历,每次更新result为每层最左侧元素。复杂度分析时间复杂度:遍历,O(N)。空间复杂度:队列层序遍历,树*似完全二叉树时O(N),树极倾斜时O(logN)。注意点略代码实现/***Definitionforabinarytreenode.......