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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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