Description


Input

Output

输出仅包含一个整数。表示最少需要多少次交换能使风铃满足Ike的条件。如果不可能满足,输出-1。

Sample Input

6

2 3

-1 4

5 6

-1 -1

-1 -1

-1 -1

Sample Output

2

题目大意:给定一棵完全二叉树,可以交换某个节点的左右儿子,求最少交换多少次数,可以使所有的叶节点深度相差不超过1,且深度较大的叶节点都在深度较小的叶节点左侧。

题解:
无解的情况好多……
首先,最大和最小的节点深度超过1就无解了。其次,如果最大深度和最小深度节点分别在一颗子树的左子树和右子树中,也是无解的。
因此,只要先做一遍DFS预处理出节点深度的有关数据,再dp就好了,注意分类就行了。
代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define ll long long
#define inf 0x7f7f7f7f
using namespace std;
int n,l[100005],r[100005],ans,minn=inf,maxx;
void dfs(int u,int dep)
{if(u==-1){maxx=max(maxx,dep);minn=min(minn,dep);return ;}dfs(l[u],dep+1);dfs(r[u],dep+1);return ;
}
int work(int u,int dep)
{int x=0,y=0;if(u==-1){if(dep==minn) return 1;return 2;}x=work(l[u],dep+1),y=work(r[u],dep+1);if((x==1 && y==2) || (x==1 && y==3) || (x==3 && y==2)) ans++;  if(x==3 && y==3){puts("-1");exit(0);}  return (x|y);
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d%d",&l[i],&r[i]);dfs(1,0);if(maxx-minn>1) return puts("-1"),0;if(maxx==minn) return puts("0"),0;work(1,0);printf("%d\n",ans);return 0;
}

【BZOJ1149】【APIO2007】风铃(完全二叉树+dp)相关推荐

  1. APIO2007风铃

    描述 你准备给弟弟Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能按照他的特有方式排成有序的东西. 你准备给Ike 买一个风铃.风铃是一种多层的装饰品,一般挂在天花板上. 每个风 ...

  2. 树形dp+树形结构总结

    总结 最近写了好多树形dp+树形结构的题目,这些题目变化多样能与多种算法结合,但还是有好多规律可以找的. 先说总的规律吧! 一般来说树形dp在设状态转移方程时都可以用f[i][]表示i这颗子树怎么怎么 ...

  3. 动态规划常见类型总结

    本文针对动态规划的常见类型进行总结.虽说总结的是动态规划,但顺便把递推也放了进来.严格来说,递推不属于动态规划问题,因为动态规划不仅有递推过程,还要有决策(即取最优),但广义的动态规划是可以包含递推的 ...

  4. 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp

    题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...

  5. leetcode13——步长k的差值小于t的元素组,包含1的正方形面积,完全二叉树的结点个数,矩形重叠面积,汇总区间

    题目一: leetcode220 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值 ...

  6. 暑假集训总结——区间DP,堆的概念及应用,STL(vector、set、pair、map、priority_queue),hash表,树状数组,图论

    序言: 经过长达十几天的集训,确实学了不少知识点.我想如果再不总结的话,6天之后又要忘完了. 所以发一篇具有总结回忆性的博客,供大家回忆. 目录会本人自己排列的时间的先后顺序来排列,可直接食用. 目录 ...

  7. 判断二叉树是否为完全二叉树

    判断二叉树是否为完全二叉树? 提示:本节仍然是重点说二叉树的DP递归套路,非常重要而且容易理解 二叉树的动态规划树形DP递归套路系列文章有这些,可以帮助你快速掌握树形DP的题目解题思想,就一个套路: ...

  8. C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)

    目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...

  9. 【缄*默】 #DP# 各种DP的实现方法(更新ing)

    DP =「状态」+「阶段」+「决策」 基本原理 = 「有向无环图」+「最优子结构」+「无后效性」 目录 一. 线性DP { 1.概念引入 } { 2.例题详解 } [例题1]caioj 1064 最长 ...

最新文章

  1. undefined control sequence_GeForce NOW在KDDI的帮助下提供服务:《Control》加入游戏库
  2. 201671030128+词频统计软件项目报告
  3. 七十九、Springboot 整合 Elasticsearch
  4. 童年真的回来了么?《摩尔庄园》手游深度分析
  5. 修改Hybris Administration console管理员默认登录密码
  6. iOS最为简单时间轴(GZTimeLine)
  7. 如何优雅处理前端异常?
  8. 静态路由协议的默认管理距离是_动态路由选择原理(距离矢量路由协议RIP)
  9. java来电报名字的软件_教你一招,手机来电话可以语音报出来电人的姓名和电话号码,收藏...
  10. php挑战答题,挑战答题小程序5.3.1开源
  11. SpringBoot整合Selenium
  12. ubuntu20.04WPS解决缺失字体的问题
  13. 位图保存到数据库 VC ado 类
  14. 适合php编程的笔记本电脑,做web前端,推荐一款笔记本电脑。
  15. Oracle 考试概要
  16. Redmi Note 11Pro+(系统降级)
  17. 信息学奥赛 一本通:1194:移动路线
  18. 上网时遇到的 404 是什么意思?
  19. 搬家公司派单订单管理系统 php,订单派单管理系统哪些功能可以帮助企业发展...
  20. Replika:AI智能聊天机器人

热门文章

  1. 解决win10只有IE可以上网,其他浏览器都无法连接网络
  2. Mysql——》索引存储模型推演
  3. QT设置应用程序图标设置
  4. 字母全排列——递归方法
  5. 笑话--老外与山东妞(爆笑)
  6. 揭秘华南地区首个高校电竞专业:不教打游戏 培养全能人才
  7. 5-46 新浪微博热门话题 (30分)
  8. 突然,我想恋爱了(一)
  9. arcgis制作符号
  10. 如何选择适合你的兴趣爱好(五十三),跳水