[luogu2585 ZJOI2006] 三色二叉树 (树形dp)
Description

Input
输入文件名:TRO.IN
输入文件仅有一行,不超过500000个字符,表示一个二叉树序列。
Output
输出文件名:TRO.OUT
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
Sample Input
1122002010
Sample Output
5 2
Code:
//By Menteur_Hxy
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ls nd[x][0]
#define rs nd[x][1]
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int N=500010;
int tot=1;
int nd[N][2],f[N][3],g[N][3];
void build(int x) {
char c=getchar();
if(c=='1'||c=='2') nd[x][0]=++tot,build(tot);
if(c=='2') nd[x][1]=++tot,build(tot);
if(c=='0') f[x][2]=g[x][2]=1;
}
void dfs(int x) {
if(ls) {
dfs(ls);
if(rs) {
dfs(rs);
f[x][0]=min(f[ls][1]+f[rs][2],f[ls][2]+f[rs][1]);
f[x][1]=min(f[ls][0]+f[rs][2],f[ls][2]+f[rs][0]);
f[x][2]=min(f[ls][0]+f[rs][1]+1,f[ls][1]+f[rs][0]+1);
g[x][0]=max(g[ls][1]+g[rs][2],g[ls][2]+g[rs][1]);
g[x][1]=max(g[ls][0]+g[rs][2],g[ls][2]+g[rs][0]);
g[x][2]=max(g[ls][0]+g[rs][1]+1,g[ls][1]+g[rs][0]+1);
} else {
f[x][0]=min(f[ls][1],f[ls][2]);
f[x][1]=min(f[ls][0],f[ls][2]);
f[x][2]=min(f[ls][0],f[ls][1])+1;
g[x][0]=max(g[ls][1],g[ls][2]);
g[x][1]=max(g[ls][0],g[ls][2]);
g[x][2]=max(g[ls][0],g[ls][1])+1;
}
}
}
int main() {
build(1);
dfs(1);
int maxn=max(g[1][0],max(g[1][1],g[1][2]));
int minn=min(f[1][0],min(f[1][1],f[1][2]));
printf("%d %d",maxn,minn);
return 0;
}
PS:写几道简单的树形dp qwq
[luogu2585 ZJOI2006] 三色二叉树 (树形dp)的更多相关文章
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
- BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )
难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...
- BZOJ 1864: [Zjoi2006]三色二叉树 树形DP + 读入
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 题解:本题大水 ...
- 【BZOJ-1864】三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 659 Solved: 469[Submit][Status] ...
- 三色二叉树——树形dp
三色二叉树 题目描述 一棵二叉树可以按照如下规则表示成一个由 \(0.1.2\) 组成的字符序列,我们称之为"二叉树序列 \(S\) ": \(0\) 该树没有子节点. \(1S_ ...
- 洛谷 P2585 [ ZJOI 2006 ] 三色二叉树 —— 树形DP
题目:https://www.luogu.org/problemnew/show/P2585 首先,三色其实记录两种状态:是绿色,不是绿色 即可,因为红蓝可以随意取反: 一开始因为懒得还原出树,所以写 ...
- BZOJ_1864_[Zjoi2006]三色二叉树_树形DP
BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...
随机推荐
- Spring MVC-表单(Form)标签-复选框(Checkbox)示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_checkbox.htm 说明:示例基于Spring MVC 4.1.6. 以下示 ...
- Linux文字分段裁剪命令cut(转)
Linux cut命令用于显示每行从开头算起num1到num2的文字. 语法 cut [-bn] [file] cut [-c] [file] cut [-df] [file] 使用说明: cut命令 ...
- MySQL必知必会面试题 基础
1.登录数据库 (1).单实例 mysql -uroot -poldboy (2).多实例 mysql -uroot -poldboy -S /data/3306/mysql.sock 2.查看数据库 ...
- POJ 1106
先判断是否在圆内,然后用叉积判断是否在180度内.枚举判断就可以了... 感觉是数据弱了.. #include <iostream> #include <cstdio> #in ...
- js左右切换 选择年龄
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- _DataStructure_C_Impl:基数排序
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #de ...
- javascript中的Base64.UTF8编码与解码详解
javascript中的Base64.UTF8编码与解码详解 本文给大家介绍的是javascript中的Base64.UTF8编码与解码的函数源码分享以及使用范例,十分实用,推荐给小伙伴们,希望大家能 ...
- BPM使用ligerUI实现主从表显示
先看一下效果图: 界面有待美化,嘿嘿,下面说一下实现过程,当然,我的代码可能不对,就比如后台给前端返回JSON对象,应该包括状态和消息和数据,我这里直接给返回了JSON对象,所以,如果有大神,您知道怎 ...
- Oracle数据库学习1------数据库安装及客户端配置
1.注册Oracle账户: 注册地址:https://login.oracle.com/mysso/signon.jsp 注意:注册的时候尽量使用外国的邮箱,因为使用国内的邮箱可能收不到Oracle发 ...
- B - Spyke Talks
Problem description Polycarpus is the director of a large corporation. There are n secretaries worki ...