【BZOJ1149】【APIO2007】风铃(完全二叉树+dp)
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)相关推荐
- APIO2007风铃
描述 你准备给弟弟Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能按照他的特有方式排成有序的东西. 你准备给Ike 买一个风铃.风铃是一种多层的装饰品,一般挂在天花板上. 每个风 ...
- 树形dp+树形结构总结
总结 最近写了好多树形dp+树形结构的题目,这些题目变化多样能与多种算法结合,但还是有好多规律可以找的. 先说总的规律吧! 一般来说树形dp在设状态转移方程时都可以用f[i][]表示i这颗子树怎么怎么 ...
- 动态规划常见类型总结
本文针对动态规划的常见类型进行总结.虽说总结的是动态规划,但顺便把递推也放了进来.严格来说,递推不属于动态规划问题,因为动态规划不仅有递推过程,还要有决策(即取最优),但广义的动态规划是可以包含递推的 ...
- 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp
题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...
- leetcode13——步长k的差值小于t的元素组,包含1的正方形面积,完全二叉树的结点个数,矩形重叠面积,汇总区间
题目一: leetcode220 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值 ...
- 暑假集训总结——区间DP,堆的概念及应用,STL(vector、set、pair、map、priority_queue),hash表,树状数组,图论
序言: 经过长达十几天的集训,确实学了不少知识点.我想如果再不总结的话,6天之后又要忘完了. 所以发一篇具有总结回忆性的博客,供大家回忆. 目录会本人自己排列的时间的先后顺序来排列,可直接食用. 目录 ...
- 判断二叉树是否为完全二叉树
判断二叉树是否为完全二叉树? 提示:本节仍然是重点说二叉树的DP递归套路,非常重要而且容易理解 二叉树的动态规划树形DP递归套路系列文章有这些,可以帮助你快速掌握树形DP的题目解题思想,就一个套路: ...
- C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)
目录 题目一 二叉树递归和非递归遍历 题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度) 题目四 如何判断一棵二叉树是搜索二叉树(BST)? 题目四 如何判断一棵二叉树是平衡 ...
- 【缄*默】 #DP# 各种DP的实现方法(更新ing)
DP =「状态」+「阶段」+「决策」 基本原理 = 「有向无环图」+「最优子结构」+「无后效性」 目录 一. 线性DP { 1.概念引入 } { 2.例题详解 } [例题1]caioj 1064 最长 ...
最新文章
- undefined control sequence_GeForce NOW在KDDI的帮助下提供服务:《Control》加入游戏库
- 201671030128+词频统计软件项目报告
- 七十九、Springboot 整合 Elasticsearch
- 童年真的回来了么?《摩尔庄园》手游深度分析
- 修改Hybris Administration console管理员默认登录密码
- iOS最为简单时间轴(GZTimeLine)
- 如何优雅处理前端异常?
- 静态路由协议的默认管理距离是_动态路由选择原理(距离矢量路由协议RIP)
- java来电报名字的软件_教你一招,手机来电话可以语音报出来电人的姓名和电话号码,收藏...
- php挑战答题,挑战答题小程序5.3.1开源
- SpringBoot整合Selenium
- ubuntu20.04WPS解决缺失字体的问题
- 位图保存到数据库 VC ado 类
- 适合php编程的笔记本电脑,做web前端,推荐一款笔记本电脑。
- Oracle 考试概要
- Redmi Note 11Pro+(系统降级)
- 信息学奥赛 一本通:1194:移动路线
- 上网时遇到的 404 是什么意思?
- 搬家公司派单订单管理系统 php,订单派单管理系统哪些功能可以帮助企业发展...
- Replika:AI智能聊天机器人