1864: [Zjoi2006]三色二叉树
1864: [Zjoi2006]三色二叉树
分析:
做得最智障的一题了。。。
首先中间输出两个数之间没空格(换行居然也过了。。。), 写了dp[i][0/1/2],后来知道其实dp[i][0/1]就行了,最zz的一个bug,,,char pos = 1...
代码:
1 #include<cstdio> 2 #include<iostream> 3 #define L ls[u] 4 #define R rs[u] 5 6 using namespace std; 7 8 const int N = 500100; 9 10 int ls[N],rs[N],dp1[N][3],dp2[N][3],pos = 1; 11 char s[N]; 12 13 void dfs(int u) { 14 if (s[u] == '0') return; 15 if (s[u] == '1' || s[u] == '2') { 16 L = ++pos; 17 dfs(pos); 18 } 19 if (s[u] == '2') { 20 R = ++pos; 21 dfs(pos); 22 } 23 } 24 25 int tsl,tsr; 26 void DP(int u) { 27 if (!u) return ; 28 dp1[u][0] = 1;dp1[u][1] = dp1[u][2] = 0; 29 dp2[u][0] = 1;dp2[u][1] = dp2[u][2] = 0; 30 31 DP(L); 32 DP(R); 33 34 dp1[u][0] = max(dp1[L][1] + dp1[R][2], dp1[L][2] + dp1[R][1]) + 1; 35 dp1[u][1] = max(dp1[L][0] + dp1[R][2], dp1[L][2] + dp1[R][0]); 36 dp1[u][2] = max(dp1[L][0] + dp1[R][1], dp1[L][1] + dp1[R][0]); 37 38 dp2[u][0] = min(dp2[L][1] + dp2[R][2], dp2[L][2] + dp2[R][1]) + 1; 39 dp2[u][1] = min(dp2[L][0] + dp2[R][2], dp2[L][2] + dp2[R][0]); 40 dp2[u][2] = min(dp2[L][0] + dp2[R][1], dp2[L][1] + dp2[R][0]); 41 } 42 int main () { 43 scanf("%s",s+1); 44 dfs(1); 45 /* for (int i=1; i<=n; ++i) 46 cout << ls[i] << " "<< rs[i] << "\n";*/ 47 DP(1); 48 cout << max(dp1[1][0],max(dp1[1][1],dp1[1][2])) << " "; 49 cout << min(dp2[1][0],min(dp2[1][1],dp2[1][2])); 50 return 0; 51 }