前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Luogu P2585 [ZJOI2006]三色二叉树 题解

Luogu P2585 [ZJOI2006]三色二叉树 题解

作者头像
yzxoi
发布2022-09-19 12:54:32
1580
发布2022-09-19 12:54:32
举报
文章被收录于专栏:OI

Luogu P2585 [ZJOI2006]三色二叉树 题解

Describe

题目链接

Solution

0-绿色,1-红色,2-蓝色。 设f[i][j]表示i节点染成j这种颜色的最大值。 如果i节点的没有儿子,那么很明显f[i][0]=1。 如果i节点有一个儿子,那么f[i][0]=max(f[to][1],f[to][2])+1,f[i][1]=max(f[to][0],f[to][2])(颜色染成蓝色与红色类似) 如果i节点有两个儿子,那么f[i][0]=max(f[lson][1]+f[rson][2],f[lson][2]+f[rson][1])+1(颜色染成红色、蓝色只需不用-1即可) 最大值如此,最小值类似。

Code

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
char str[500010];
int f[500010][3],g[500010][3],tot;
inline void DFS(int x){
    if(str[x]=='0'){
        f[x][0]=g[x][0]=1;
        return ;
    }else if(str[x]=='1'){
        int son=x+1;
        DFS(++tot);
        f[x][0]=max(f[son][1],f[son][2])+1;
        f[x][1]=max(f[son][0],f[son][2]);
        f[x][2]=max(f[son][0],f[son][1]);
        g[x][0]=min(g[son][1],g[son][2])+1;//最小值
        g[x][1]=min(g[son][0],g[son][2]);
        g[x][2]=min(g[son][0],g[son][1]);
    }else if(str[x]=='2'){
        int l=x+1;DFS(++tot);
        int r=tot+1;DFS(++tot);
        f[x][0]=max(f[l][1]+f[r][2],f[l][2]+f[r][1])+1;
        f[x][1]=max(f[l][0]+f[r][2],f[l][2]+f[r][0]);
        f[x][2]=max(f[l][0]+f[r][1],f[l][1]+f[r][0]);
        g[x][0]=min(g[l][1]+g[r][2],g[l][2]+g[r][1])+1;//最小值
        g[x][1]=min(g[l][0]+g[r][2],g[l][2]+g[r][0]);
        g[x][2]=min(g[l][0]+g[r][1],g[l][1]+g[r][0]);
    }
}
int main(){
    cin>>str+1;
    DFS(++tot);
    cout<<max(f[1][0],max(f[1][1],f[1][2]))<<" "<<min(g[1][0],min(g[1][1],g[1][2]))<<endl;
} 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Luogu P2585 [ZJOI2006]三色二叉树 题解
    • Describe
      • Solution
        • Code
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档