BZOJ1864 Zjoi2006 三色二叉樹

2021-08-09 13:46:15 字數 1145 閱讀 6524

標籤:樹形dp

description

input

僅有一行,不超過500000個字元,表示乙個二叉樹序列。

output

輸出檔案也只有一行,包含兩個數,依次表示最多和最少有多少個點能夠被染成綠色。

sample input

1122002010

sample output

5 2題意:給定一棵二叉樹,將其染色(紅,綠,藍),其父親節點必須和兩個兒子節點染上不同的顏色,兩個兒子節點也必須染不同顏色,問最多最少有多少個節點被染成綠色

分析:f[i][0]表示當前節點沒染綠色的最大值    f[i][1]表示當前節點染上綠色的最大值

f[i][0]=max(f[l[x]][1]+f[r[x]][0] ,f[l[x]][0]+f[r[x]][1]);

f[i][1]=f[l[x]][0]+f[r[x]][0]+1

最小值同理

code

#include#include#include#include#include#include#include#include#include#define rep(i,a,b) for(int i=a;i<=b;i++)

#define dep(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

#define mem(x,num) memset(x,num,sizeof x)

#define reg(x) for(int i=head[x];i;i=e[i].next)

using namespace std;

const int maxn=3e5+6;

ll f[maxn][3],l[maxn],r[maxn],ans1,ans2,cnt=1;

inline void read(int x)

}void dp1(int x)

void dp2(int x)

int main()

bzoj1864 Zjoi2006 三色二叉樹

傳送門 大力建出樹後大力dp 設f i j 表示以i為根節點,根節點顏色為j是的最優解。每次列舉當前結點節點顏色和兒子顏色,時間複雜度o n 27 uses math var a,b array 0.500005,1.3 of longint c array 0.500005 of longint ...

bzoj 1864 Zjoi2006 三色二叉樹

description input 僅有一行,不超過500000個字元,表示乙個二叉樹序列。output 輸出檔案也只有一行,包含兩個數,依次表示最多和最少有多少個點能夠被染成綠色。sample input 1122002010 sample output 5 2 hint source day1 ...

BZOJ1864 Zjoi2006 三色二叉樹

僅有一行,不超過500000個字元,表示乙個二叉樹序列。輸出檔案也只有一行,包含兩個數,依次表示最多和最少有多少個點能夠被染成綠色。1122002010 5 2仔細考慮我們發現,乙個節點的顏色只有是綠色和不是綠色兩種。如果乙個點x不是綠色,那麼根據抽屜原理,它的兩個兒子一定是乙個綠色,乙個不是綠色。...