[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,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当 ...
随机推荐
- djanjo ORM 一对多、多对多
一.表操作之一对多 定义表结构:定义了UserType.两张表UserInfo,如下: from django.db import models class UserType(models.Model ...
- PHP扩展开发-测验成功
原文:http://kimi.it/496.html http://blog.csdn.net/u011957758/article/details/72234075 ---------------- ...
- CLLocationManagerDelegate的解说
1.//新的方法.登陆成功之后(旧的方法就无论了) - (void)locationManager:(CLLocationManager *)manager didUpdateLocatio ...
- sql处理高并发
sql处理高并发,防止库存超卖 2014-08-14 23:44 13560人阅读 评论(2) 收藏 举报 分类: 数据库(43) 今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖 ...
- Cocos2d-x 3.0final 终结者系列教程13-贪食蛇游戏案例(全)
快过节了.谢谢了屈原,我们爱你. 应该多几个向屈大人一样跳江的,这样我们就能够放假纪念啦. ---------------------------------快过节了.弄个案例,大家最好还是假期做做, ...
- php 在同一个表单中加入和改动
大家写站点的时候可能都会遇到这样的情况,就是写一个表单,这个表单是用来加入一篇文章的,我们屁颠屁颠的在后台接收数据,然后存入数据库.如今有个问题.当你要对该文章进行改动的时候,你是怎么处理的? 我的方 ...
- hdu 1085(普通母函数)
Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- codeforces 712A. Memory and Crow
2019-05-18 08:48:27 加油,加油,坚持!!! 这道题我没有想出公式推导,只是按照模拟题来做,第5个样例超时 样例超时,方法错误 https://www.cnblogs.com/ECJ ...
- 如何正确产看API
看API时,先看的它的父接口自接口,及其相关的抽象类和子类 看完后,看概述的第一段话就行,后面的不用看. 再看构造方法,并到底层去看构造方法里参数的具体含义. 最后,再将包含的方法一个个进行测试. 解 ...
- Cupid's Arrow[HDU1756]
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...