bzoj 1864 三色二叉树
Description
Input
仅有一行,不超过500000个字符,表示一个二叉树序列。
Output
输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。
Sample Input
Sample Output
HINT
Source
Day1
思路: 本题是树型dp,题目给出的字符序列刚好可以递归构造二叉树。
然后用f[x][0],g[x][0]分别表示当x涂成绿色的时候这个子树绿色的点最多和最少的数量。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define re register 4 #define R re int 5 #define rep(i,a,b) for(R i=a;i<=b;i++) 6 #define Rep(i,a,b) for(R i=a;i>=b;i--) 7 #define ms(i,a) memset(a,i,sizeof(a)) 8 #define lc ch[x][0] 9 #define rc ch[x][1] 10 template<class T>void read(T &x){ 11 x=0; char c=0; 12 while (!isdigit(c)) c=getchar(); 13 while (isdigit(c)) x=x*10+(c^48),c=getchar(); 14 } 15 int const N=500001; 16 int const inf=1e8; 17 int n,ch[N][2],f[N][3],sum,x,g[N][3]; 18 char s[N]; 19 void dfs(){ 20 int t=++sum; 21 if(s[x]=='0') return; 22 if(s[x]=='1') ch[t][0]=sum+1,x++,dfs(); 23 if(s[x]=='2'){ 24 ch[t][0]=sum+1; x++;dfs(); 25 ch[t][1]=sum+1; x++;dfs(); 26 } 27 } 28 void solve(int x){ 29 if(x==0) return ; 30 if(!lc){ 31 f[x][0]=g[x][0]=1; return; 32 } 33 solve(lc); solve(rc); 34 if(!rc){ 35 f[x][0]=1+max(f[lc][1],f[lc][2]); 36 f[x][1]=max(f[lc][0],f[lc][2]); 37 f[x][2]=max(f[lc][0],f[lc][1]); 38 g[x][0]=1+min(g[lc][1],g[lc][2]); 39 g[x][1]=min(g[lc][0],g[lc][2]); 40 g[x][2]=min(g[lc][0],g[lc][1]); 41 }else { 42 f[x][0]=1+max(f[lc][1]+f[rc][2],f[lc][2]+f[rc][1]); 43 f[x][1]=max(f[lc][0]+f[rc][2],f[rc][0]+f[lc][2]); 44 f[x][2]=max(f[lc][0]+f[rc][1],f[rc][0]+f[lc][1]); 45 g[x][0]=1+min(g[lc][1]+g[rc][2],g[lc][2]+g[rc][1]); 46 g[x][1]=min(g[lc][0]+g[rc][2],g[rc][0]+g[lc][2]); 47 g[x][2]=min(g[lc][0]+g[rc][1],g[rc][0]+g[lc][1]); 48 } 49 } 50 int main(){ 51 scanf("%s",s); 52 dfs(); 53 solve(1); 54 printf("%d %d\n",max(f[1][0],max(f[1][1],f[1][2])),min(g[1][0],min(g[1][1],g[1][2]))); 55 return 0; 56 }
View Code
转载于:https://www.cnblogs.com/ZJXXCN/p/10189090.html
bzoj 1864 三色二叉树相关推荐
- 1864: [Zjoi2006]三色二叉树
1864: [Zjoi2006]三色二叉树 链接 分析: 做得最智障的一题了... 首先中间输出两个数之间没空格(换行居然也过了...), 写了dp[i][0/1/2],后来知道其实dp[i][0/1 ...
- 【BZOJ-1864】三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 659 Solved: 469 [Submit][Statu ...
- bzoj 1864: [Zjoi2006]三色二叉树
Description solution 正解:递归+树型DP 我们首先递归建树 然后考虑树型DP,我们设绿色的节点为Y,非绿色为N 我们神奇的发现:N会形成是很多条相互独立的链 也就是说 Y 的下发 ...
- 1864. [ZJOI2006]三色二叉树【树形DP】
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...
- BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample ...
- 洛谷P2585 [ZJOI2006]三色二叉树
题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
题目:https://www.luogu.org/problemnew/show/P2585 可以把不是绿色的记成一种.仔细一想不会有冲突.如果自己是绿色,孩子的不同颜色不会冲突:如果自己不是绿色,自 ...
- 2017.9.24 三色二叉树 思考记录
树形dp入门题,,,,枚举转移即可. 设f[i][0]表示这个点不是绿色 f[i][1]表示这个点是绿色. 由于要求是相邻和两儿子,所以枚举下面点的情况转移就可以了 码: #include<io ...
- 洛谷P2585[ZJOI2006]三色二叉树(树形DP)
思路 树形DP,首先是递归建树,然后是DP状态方程转移. 代码 #include<cstdio> #include<cstring> #include<algorithm ...
- 三色视者与四色视者身后的理论基础:色彩原理
理论上,常人的肉眼是三色视觉(Trichromacy),通过三种视锥细胞(也可以说感光色素)来生成蓝色.绿色和红色的波长.但是,肉眼的不足之处是存在同色异谱色(metamers),也就是说尽管色彩看起 ...
最新文章
- Shell引用-逻辑判断
- php 该throw还是该404,前端魔法堂——异常不仅仅是try/catch
- nyist --- 组队赛(四)
- 苹果4怎么越狱_苹果手机如何截屏
- 小程序 array.map_Array.map解释了4个复杂级别:从5岁到功能程序员。
- mysql源码分析书籍_从源码分析 MySQL 死锁问题入门
- Node.js webpack 打包的入口与出口
- 磁盘格式化(mkfs命令)、磁盘挂载(mount)、手动添加swap
- Java序列化中的SerialVersionUid
- 迅雷下gho文件变成php,GHO格式文件转换成WIM格式文件
- android 会自动横屏再竖屏,Android横屏竖屏切换的问题
- 如何免费申请js.org二级域名
- jQuery购物车 商品数量加减和小计
- vue动态增加商品属性
- ros入门启动小海龟(ros2版本)
- 湖人詹姆斯 戴维斯 拉塞尔三人合体就赢!
- echart各个柱体设置不同颜色
- linux的crontab定时任务完整配置和定时任务不执行分析
- java视频点播系统_jsp教学视频点播系统
- ubuntu 进入紧急救援模式
热门文章
- 应届生,一口气拿下微软、Hulu、Amazon、腾讯、百度、网易、美团、华为等18家公司SP Offer面经...
- 局域网传文件_iPhone与安卓跨系统「隔空投送」,传大文件超好用
- 使用Hexo 在本地搭建博客(一)
- C语言入门(一)——程序的基本概念
- 论文解析 | 不确定性校准的化学反应预测模型
- 深度学习中对神经网络的理解
- projective TSDF/TSDF/flipped TSDF三种截断符号距离函数比较的个人理解
- 虽然没有见过凌晨四点的洛杉矶,但是我们见证了了凌晨灯火通明科技园:程序员的痛谁懂
- Cuba 设置debug模式
- ArcGIS10.6基本操作——利用DEM给点赋予高程值