ccz181078

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::
  427 随笔 :: 0 文章 :: 15 评论 :: 16万 阅读

Description

Input

仅有一行,不超过500000个字符,表示一个二叉树序列。

Output

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

记录每个节点染成每种颜色时以此节点为根的子树中绿色节点个数的最大值和最小值

信息由叶节点向上传递

复制代码
#include<cstdio>
int n;
int p=0,mxv=0,mnv=2147483647;
int m3[]={0,1,2,0,1,2};
char s[500005];
int cmax[500005][3];
int cmin[500005][3];
inline void maxs(int&a,int b){if(a<b)a=b;}
inline void mins(int&a,int b){if(a>b)a=b;}
void dfs(int w){
    p=w;
    if(s[w]=='0'){
        cmax[w][0]=cmin[w][0]=1;
    }else if(s[w]=='1'){
        dfs(w+1);
        for(int i=0;i<3;i++){
            cmin[w][i]=2147483647;
        for(int j=0;j<3;j++)
        if(i!=j){
            maxs(cmax[w][i],cmax[w+1][j]);
            mins(cmin[w][i],cmin[w+1][j]);
        }
        }
        cmax[w][0]++;
        cmin[w][0]++;
    }else{
        dfs(w+1);
        int r=p+1;
        dfs(r);
        for(int i=0;i<3;i++){
            cmin[w][i]=2147483647;
        for(int j=0;j<3;j++)
        if(i!=j){
            int k=m3[i+j];
            maxs(cmax[w][i],cmax[w+1][j]+cmax[r][k]);
            mins(cmin[w][i],cmin[w+1][j]+cmin[r][k]);
        }
        }
        cmax[w][0]++;
        cmin[w][0]++;
    }
}
int main(){
    scanf("%s",s);
    dfs(0);
    for(int i=0;i<3;i++){
        maxs(mxv,cmax[0][i]);
        mins(mnv,cmin[0][i]);
    }
    printf("%d %d\n",mxv,mnv);
    return 0;
}
复制代码

 

posted on   nul  阅读(170)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示