Written with StackEdit.

Description

Input

仅有一行,不超过\(5*10^5\)个字符,表示一个二叉树序列。

Output

输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。

Sample Input

1122002010

Sample Output

5 2

Solution

  • 一道比较水的树形\(dp\).
  • 读入考察递归的使用.然后就是一个\(ex-\)没有上司的舞会.
  • 令\(f[i][0/1/2]\)表示当\(i\)的颜色分别为绿,红,蓝时,根节点为\(i\)的子树的最大绿点数.
  • \(g[i][0/1/2]\)表示当\(i\)的颜色分别为绿,红,蓝时,根节点为\(i\)的子树的最小绿点数,
  • 然后就是弱智一般的转移了.
#include<bits/stdc++.h>
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
const int MAXN=5e5+10;
int idx=1;
int ls[MAXN],rs[MAXN],sons[MAXN];
void readtree(int x)
{
char ch=getchar();
if(ch=='1')
{
ls[x]=++idx;
readtree(idx);
sons[x]=1;
}
if(ch=='2')
{
ls[x]=++idx;
readtree(idx);
rs[x]=++idx;
readtree(idx);
sons[x]=2;
}
}
int f[MAXN][3];//max
int g[MAXN][3];//min
//0 green
//1 red
//2 blue
void dfs(int u)
{
if(sons[u]==0)
{
f[u][0]=1;
// f[u][1]=0;
// f[u][2]=0;
g[u][0]=1;
// g[u][1]=0;
// g[u][2]=0;
}
#define l ls[u]
#define r rs[u]
else if(sons[u]==1)
{
dfs(l);
f[u][0]=max(f[l][1],f[l][2])+1;
f[u][1]=max(f[l][0],f[l][2]);
f[u][2]=max(f[l][0],f[l][1]); g[u][0]=min(g[l][1],g[l][2])+1;
g[u][1]=min(g[l][0],g[l][2]);
g[u][2]=min(g[l][0],g[l][1]);
}
else if(sons[u]==2)
{
dfs(l);
dfs(r);
f[u][0]=max(f[l][1]+f[r][2],f[l][2]+f[r][1])+1;
f[u][1]=max(f[l][0]+f[r][2],f[l][2]+f[r][0]);
f[u][2]=max(f[l][0]+f[r][1],f[l][1]+f[r][0]); g[u][0]=min(g[l][1]+g[r][2],g[l][2]+g[r][1])+1;
g[u][1]=min(g[l][0]+g[r][2],g[l][2]+g[r][0]);
g[u][2]=min(g[l][0]+g[r][1],g[l][1]+g[r][0]);
}
}
int main()
{
readtree(1);
dfs(1);
int maxans=max(f[1][0],max(f[1][1],f[1][2]));
int minans=min(g[1][0],min(f[1][1],g[1][2]));
printf("%d %d\n",maxans,minans);
return 0;
}

bzoj 1864 三色二叉树的更多相关文章

  1. BZOJ 1864 三色二叉树 - 树型dp

    传送门 题目大意: 给一颗二叉树染色红绿蓝,父亲和儿子颜色必须不同,两个儿子颜色必须不同,问最多和最少能染多少个绿色的. 题目分析: 裸的树型dp:\(dp[u][col][type]\)表示u节点染 ...

  2. BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )

    难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...

  3. 【BZOJ】1864: [Zjoi2006]三色二叉树

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1295  Solved: 961[Submit][Status ...

  4. BZOJ 1864:[Zjoi2006]三色二叉树(树DP)

    三色二叉树 问题描述 输入 仅有一行,不超过500000个字符,表示一个二叉树序列. 输出 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 样例输入 1122002010 ...

  5. bzoj千题计划212:bzoj1864: [Zjoi2006]三色二叉树

    http://www.lydsy.com/JudgeOnline/problem.php?id=1864 #include<cstdio> #include<cstring> ...

  6. 1864: [Zjoi2006]三色二叉树

    1864: [Zjoi2006]三色二叉树 链接 分析: 做得最智障的一题了... 首先中间输出两个数之间没空格(换行居然也过了...), 写了dp[i][0/1/2],后来知道其实dp[i][0/1 ...

  7. BZOJ1864[ZJOI2006]三色二叉树[树形DP]

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 773  Solved: 548[Submit][Status] ...

  8. 【BZOJ-1864】三色二叉树 树形DP

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 659  Solved: 469[Submit][Status] ...

  9. 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP

    1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...

随机推荐

  1. $微信小程序开发实践点滴——Bmob基本REST API的python封装

    Refer:Bmob后端云REST API接口文档:http://docs.bmob.cn/data/Restful/a_faststart/doc/index.html 本文使用python对Bmo ...

  2. sublime使用sublimelint-luacheck屏蔽指定警告

    在成功安装SublimeLinter-lua与luacheck以后,如果没有语法error,则会进行警告提示. 如下图 waring: line contains trailing whitespac ...

  3. 超详细 Linux 下编译安装Redis 以及php配套使用

    一.Linux 下安装Redis 下载地址:http://redis.io/download,下载最新文档版本. 把鼠标移到上图的绿色框上,就会显示下图提示:(直接右键复制链接就好) 本教程使用的旧版 ...

  4. apache kafka配置中request.required.acks含义

    Kafka producer的ack有3中机制,初始化producer时的producerconfig可以通过配置request.required.acks不同的值来实现. 0:这意味着生产者prod ...

  5. Android的四种储存方式(SQLite、FileSystem、SDCardSystem、SharedPreferences)

    主要记录一下安卓中几种常用的存储方式的用法. 一.SQLite 1.创建SQLiteOpenHelper对象(当然SQLiteOpenHelper是抽象类,不能直接创建): 2.通过上面创建的对象调用 ...

  6. 排序方法整理Java - 冒泡排序、选择排序、插入排序、快速排序

    /** * 排序方法整理 * @author zhyea * */ public class Sort { /** * 冒泡排序,从小到大. * 冒泡排序是比较相邻的两个元素,若顺序错误,则执行交换. ...

  7. Mine_hibernate

    1. __z知识点\整理_归纳 ==> "ZC_归纳.txt" 和 "ZC_归纳__12_用Eclipse开发hibernate.txt" 2.

  8. Linux软件安装(二)

    1. 安装软件时,如果依赖的文件是 .so 类型的文件(so文件是谋个文件的小功能模块,如果php.ini中设置的模块引用就是 .so文件) ,这时被依赖的软件要安装完整的软件,一般可以根据 .so ...

  9. 随机森林和adaboost算法(待更新)

    Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).

  10. 【转】安装OS X虚拟机错误vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123

    新建一个虚拟机, 选择客户机操作系统为Apple MacOS X 10.10, 其余参数可以默认. 注意建好之后不要急着打开客户机, 因为直接打开你会发现新建的客户机将会无法启动. 仔细阅读Mac O ...