zoukankan      html  css  js  c++  java
  • NOIP2018PJT4 对称二叉树

    一年后回首此题,此乃暴力也。

    遇到T4想暴力,这个基本的框架应该熟练掌握,这就是一个基本的学习经验了,要形成这个直觉思维,这个基本的意识大家再熟悉一下,没AK NOIP就不应该了,对吧,诶。

    #include<bits/stdc++.h>
    using namespace std;
    int w[1000005];
    int a[1000005][2];
    int s[1000005];
    void dfs(int x)//求出以编号x的节点为根的树的节点数量
    {
    	s[x]=1;//根
    	if(a[x][0]!=-1) dfs(a[x][0]),s[x]+=s[a[x][0]];//左子树
    	if(a[x][1]!=-1) dfs(a[x][1]),s[x]+=s[a[x][1]];//右子树
    }
    bool dfs1(int x,int y)
    {
    	if(x==-1&&y==-1) return 1;//无左右子树,即叶节点,对称
    	if(x!=-1&&y!=-1&&s[x]==s[y]&&w[x]==w[y])//左右相应位置比较
    	{
    		if(dfs1(a[x][0],a[y][1])&&dfs1(a[x][1],a[y][0])) return 1;//左左-右右,左右-右左
    	}
    	return 0;
    }
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",&w[i]);//输入每个节点的权值
    	for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]);//输入左右孩子
    	dfs(1);
    	int ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		if(dfs1(a[i][0],a[i][1])) ans=max(ans,s[i]);//求出所有对称二叉树中节点最多的
    	}
    	printf("%d",ans);
    	return 0;
    } 
    

      关于NOIP,它寿终正寝了。一路顺风!

  • 相关阅读:
    tyvj[1087]sumsets
    tyvj[1089]smrtfun
    [bzoj3289]Mato的文件管理
    luogu[2093]零件分组
    luogu[1135]奇怪的电梯
    codevs[1300]文件排版
    luogu[1140]相似基因
    动态规划练习题 胖男孩
    动态规划练习题 汇率
    vijos[1355]车队过桥问题
  • 原文地址:https://www.cnblogs.com/dong-ji-yuan/p/11843515.html
Copyright © 2011-2022 走看看