[BZOJ1864][CODEVS2462]三色二叉树】的更多相关文章

题目描述 Description 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为“二叉树序列S”: |-0  表示该树没有子节点 S = |-1S1 表示该树有一个子节点,S1为其子树的二叉树排列 |- 2S1S2 表示该树有连个个子节点,S1.S2为其子树的二叉树排列 你的任务是要对一棵二叉树的节点进行染色.每个节点可以被染成红色.绿色或蓝色.并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同.给定一棵二叉树的二叉树序…
[BZOJ1864]三色二叉树(动态规划) 题面 BZOJ 题解 首先把树给构出来. 设\(f[i][0/1]\)表示当前节点\(i\),是否是绿色节点的子树中最大/最小的绿色节点的个数和. 转移很显然. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include…
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 773  Solved: 548[Submit][Status][Discuss] Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample Input 1122002010 Sample Output 5 2 HINT…
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 659  Solved: 469[Submit][Status][Discuss] Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample Input 1122002010 Sample Output 5 2 HINT…
http://www.lydsy.com/JudgeOnline/problem.php?id=1864 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 500001 char s[N]; int root; ]; int m; ],f[N][]; void dfs(int &rt) { rt=++m; '; if(!tmp) return…
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample Input 1122002010 Sample Output 5 2 树形dp-- 先讲最大值怎么求 令f[i][0]表示i这个点不染绿色,i下面的子树最多能取多少个绿色的点 f[i][1]表示i这个点染了绿色,i下面的子树最多能取多少个绿色的点 首先考虑对于一个点,如果染了绿色,那么根据题目所述,…
bzoj1864,懒得复制,戳我戳我 Solution: 其实想出来了\(dp\)方程推出来了最大值,一直没想到推最小值 \(dp[i][1/0]\)表示\(i\)号节点的子树中的绿色染色最大值,\(1\)表示该节点染色,\(0\)表示该节点不染色 \[dp[i][1]=dp[ls][0]+dp[rs][0]+1\] \[dp[i][0]=max(dp[ls][1]+dp[rs][0],dp[rs][1]+dp[ls][0])\] \(f[i][1/0]\)表示存的最小值,状态同上 \[f[i]…
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample Input 1122002010 Sample Output 5 2 题解:经典的树形DP题.用f[i]表示点i是绿色时最多有多少个点能被染成绿色,g[i]表示i不是绿色时最多有多少个点被染成绿色,容易推出状态转移方程: f[i]=g[ch[i][0]]+…
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1195 Solved: 882 [Submit][Status][Discuss] Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample Input 1122002010 Sample Output 5 2 HINT…
难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<cctype>   using namespace std;   const int maxn = 500009;   int N = 0,…
BZOJ_1864_[Zjoi2006]三色二叉树_树形DP 题意: 分析:递归建树,然后DP,从子节点转移. 注意到红色和蓝色没有区别,因为我们可以将红蓝互换而方案是相同的.这样的话我们只需要知道当前节点是否为绿色即可. 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define N 500050 int lson[N],rson[N],cnt…
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1295  Solved: 961[Submit][Status][Discuss] Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample Input 1122002010 Sample Output 5 2 HINT…
1864: [Zjoi2006]三色二叉树 链接 分析: 做得最智障的一题了... 首先中间输出两个数之间没空格(换行居然也过了...), 写了dp[i][0/1/2],后来知道其实dp[i][0/1]就行了,最zz的一个bug,,,char pos = 1... 代码: #include<cstdio> #include<iostream> #define L ls[u] #define R rs[u] using namespace std; ; ],dp2[N][],pos…
[ZJOI2006]三色二叉树 BZOJ luogu 分3种颜色讨论转移一下 #include<bits/stdc++.h> using namespace std; const int _=500005; int n,now; int ls[_],rs[_],r[_],g[_],b[_]; char s[_]; void bu(int u){ if(s[u]=='1'||s[u]=='2'){++now;bu(ls[u]=now);} if(s[u]=='2'){++now;bu(rs[u]…
三色二叉树 问题描述 输入 仅有一行,不超过500000个字符,表示一个二叉树序列. 输出 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 样例输入 1122002010 样例输出 5 2   分析:简单树DP program tree1; var f,g:..,..]of longint; l,r:..]of longint; n,i,m,x,y,sum,len:longint; s:ansistring; function max(x,y:longint):lo…
P2585 [ZJOI2006]三色二叉树 题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 输入输出样例 输入样例#1: 1122002010 输出样例#1: 5 2 思路: 我们只关心绿色节点的数目,而红色蓝色可以看作无色, 但是对于一个根节点和它的两个儿子,必须有一个绿色节点 按照树形DP的思路,我…
三色二叉树 题目描述 一棵二叉树可以按照如下规则表示成一个由 \(0.1.2\) 组成的字符序列,我们称之为"二叉树序列 \(S\) ": \(0\) 该树没有子节点. \(1S_1\) 该树有一个子节点. \(S_1\) 为其二叉树序列 \(1S_1S_2\) 该树有两个子节点,\(S_1,S_2\) 分别为两个二叉树的序列 例如,下图所表示的二叉树可以用二叉树序列 \(S=21200110\) 来表示. 你的任务是要对一棵二叉树的节点进行染色.每个节点可以被染成红色.绿色或蓝色.并…
[树形DP]三色二叉树 标签(空格分隔): 树形DP [题目] 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 该树有两个子节点,S1,S2分别为两个二叉树的序列 例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示. 你的任务是要对一棵二叉树的节点进行染色.每个节点可以被染成红色.绿色或蓝色.并且,一个节点与其子节点的颜色必须不同,如果该节点有两个…
题目描述 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 该树有两个子节点,S1,S2分别为两个二叉树的序列 例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示. 你的任务是要对一棵二叉树的节点进行染色.每个节点可以被染成红色.绿色或蓝色.并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同.给定一棵二…
题目:https://www.luogu.org/problemnew/show/P2585 首先,三色其实记录两种状态:是绿色,不是绿色 即可,因为红蓝可以随意取反: 一开始因为懒得还原出树,所以写了个错误贪心-_- #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; int k,mx,mn,siz[maxn]; c…
题目描述 输入 仅有一行,不超过500000个字符,表示一个二叉树序列. 输出 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 样例输入 1122002010 样例输出 5 2 题解 比较简单的一道树形dp f[i]表示i为绿色时以i为根的子树中绿色节点的个数和,g[i]表示i不为绿色时以i为根的子树中绿色节点的个数和,由于这是一棵二叉树,很容易推出状态转移方程为f[i]=g[l[i]]+g[r[i]];g[i]=min/max(f[l[i]]+g[r[i]],g[…
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. 记录每个节点染成每种颜色时以此节点为根的子树中绿色节点个数的最大值和最小值 信息由叶节点向上传递 #include<cstdio> int n; ,mxv=,mnv=; ,,,,,}; ]; ][]; ][]; inline void maxs(int&a,int b){if(a<b)a=b;}…
原题地址:https://www.luogu.org/problemnew/show/P2585 题目大意:可以把一个节点染成三种颜色,父节点和两个子节点(可以有一个)颜色不能相同.求最多(少)能有多少个点能被染成绿色 由于是一棵树,多决策的问题,很明显的树形DP. 关于树形DP详见https://www.cnblogs.com/lizitong/p/10020914.html 二维状态,dp[i][j] j取0,1,2表示三种颜色.表示以这个编号为父节点取这个颜色时候有dp[i][j]个点能被…
题目大意:给定一个二叉树,可以染红绿黄三种颜色,要求父节点和子节点的颜色不同,且如果一个节点有两个子节点,那么两个子节点之间的颜色也不同.求最多和最少有多少个节点会被染成绿色. 题解:加深了对二叉树的理解. 对于二叉树来说,每个节点只需保留左右儿子节点编号即可.设 \(f[i]\) 表示以 i 为根的子树且 i 是绿色的绿色节点个数,\(g[i]\) 表示以 i 为根的子树,且 i 不是绿色的绿色节点个数,每次对于 \(g[i]\) 有两种决策,取相应的最优值即可. 代码如下 #include…
传送门 题目大意: 给一颗二叉树染色红绿蓝,父亲和儿子颜色必须不同,两个儿子颜色必须不同,问最多和最少能染多少个绿色的. 题目分析: 裸的树型dp:\(dp[u][col][type]\)表示u节点染为col(0-绿色,1-红色,2-蓝色),当前求的是type(0-最小,1-最大)解. 然后最后输出最大为\(max(dp[1][0][1], dp[1][1][1], dp[1][2][1])\),最小为\(min(dp[1][0][0], dp[1][1][0], dp[1][2][0])\).…
题目描述 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 该树有两个子节点,S1,S2分别为两个二叉树的序列 例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示. 你的任务是要对一棵二叉树的节点进行染色.每个节点可以被染成红色.绿色或蓝色.并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同.给定一棵二…
题目 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": \[S=\left\{ \begin{aligned} 0 &\ \ 表示该树没有子节点 \\ 1S_1 &\ \ 表示该树有一个子节点,S_1为其子树的二叉树序列 \\ 2S_1S_2 &\ \ 表示该树有两个子节点,S_1和S_2分别表示其两个子树的二叉树序列 \end{aligned} \right. \] 例如,下图所表示的二叉树可以用二叉树序列S=212…
Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为“二叉树序列S”: 例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示. 你的任务是要对一棵二叉树的节点进行染色.每个节点可以被染成红色.绿色或蓝色.并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同.给定一棵二叉树的二叉…
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample Input 1122002010 Sample Output 5 2 HINT   Source Day1   题解 这道题我们考虑dp 我们先把树给构造出来(可以用栈,也可以用dfs) 建完树后,我们用f[i][0/1/2][0]表示i节点填绿/蓝/红色的最小答案,f[i][0/1/2][1]表示…
Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色. Sample Input 1122002010 Sample Output 5 2 f[x][1\2\3]代表x点染红绿蓝色的最多有多少个点染成绿色g[x][1\2\3]代表最少 #include<iostream> #include<cstring> #include<cstdio>…