BZOJ1864 Zjoi2006 三色二叉樹

2022-03-29 16:43:10 字數 2205 閱讀 6397

bzoj1864: [zjoi2006]三色二叉樹

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

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

1122002010

5 2很明顯,一道樹形$dp$。

首先,那個序列轉換成樹,應該沒有什麼問題,一發$dfs$搞定。

然後就是在樹上$dp$。

那個最大最小值先不管它,對於一種情況討論,另外一種情況同理即可。

先看最大值:

設$dp[i][0/1/2]$表示對於$i$的子樹,$i$塗綠色$0$,紅色$1$,藍色$2$,所能達到的最多的綠色節點個數。

然後對於$i$的兒子個數$num[i]$開始特判:

這個說明$i$為葉子節點,直接$dp[i][0]=1;dp[i][1]=dp[i][2]=0;$即可。

只有乙個兒子也很好辦,分類討論兒子塗什麼顏色即可:

$$dp[i][0]=\max\left\{}dp[j][1]+1\\dp[j][2]+1\end\right.j\in son_i$$

$$dp[i][1/2]=\max\left\{}dp[j][0]\\dp[j][2/1]\end\right.j\in son_i$$

注:斜槓表示兩種方案只選一種,並且不同的兩個斜槓表示的四個決策是兩兩對應的。

額,這個就稍微有點煩人了,但是還是很好想:

$$dp[i][0]=\max\left\{}\max\left\{}dp[j_1][1]+1\\dp[j_2][2]+1\end\right.\\\\\max\left\{}dp[j_1][2]+1\\dp[j_2][1]+1\end\right.\end\right.$$

$$dp[i][1/2]=\max\left\{}\max\left\{}dp[j_1][0]\\dp[j_2][2/1]\end\right.\\\\\max\left\{}dp[j_1][2/1]\\dp[j_2][0]\end\right.\end\right.$$

其中$j_1,j_2\in son_i$。

然後就是$dfs$一遍就可以出解了。

最後答案就是:$$\max\left\{}dp[1][0]\\dp[1][1]\\dp[1][2]\end\right.$$

這只對於最大值,最小值同理。

記得最小值開始時要賦為$+\infty$。

本蒟蒻表示$1a$很高興!

附**:

#include#include#include#include#define maxn 500010

using namespace std;

int n=1,c=1,pos=1;

int head[maxn],num[maxn],f[maxn][3],g[maxn][3];

struct treea[maxn<<1];

char str[maxn];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}inline void add(int x,int y)

void dfs(int rt)

}void dp(int rt)

else if(num[rt]==1)

} else

f[rt][0]=max(f[rt][0],max(f[son[0]][1]+f[son[1]][2],f[son[0]][2]+f[son[1]][1])+1);

f[rt][1]=max(f[rt][1],max(f[son[0]][0]+f[son[1]][2],f[son[0]][2]+f[son[1]][0]));

f[rt][2]=max(f[rt][2],max(f[son[0]][0]+f[son[1]][1],f[son[0]][1]+f[son[1]][0]));

g[rt][0]=min(g[rt][0],min(g[son[0]][1]+g[son[1]][2],g[son[0]][2]+g[son[1]][1])+1);

g[rt][1]=min(g[rt][1],min(g[son[0]][0]+g[son[1]][2],g[son[0]][2]+g[son[1]][0]));

g[rt][2]=min(g[rt][2],min(g[son[0]][0]+g[son[1]][1],g[son[0]][1]+g[son[1]][0])); }}

void work()

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 ...

BZOJ1864 Zjoi2006 三色二叉樹

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

bzoj 1864 Zjoi2006 三色二叉樹

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