fork download
  1. // ~~ icebear ~~
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7. typedef pair<int, ii> iii;
  8.  
  9. template<class T>
  10. bool minimize(T &a, const T &b) {
  11. if (a > b) return a = b, true;
  12. return false;
  13. }
  14.  
  15. template<class T>
  16. bool maximize(T &a, const T &b) {
  17. if (a < b) return a = b, true;
  18. return false;
  19. }
  20.  
  21. #define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
  22. #define FORR(i,a,b) for(int i=(a); i>=(b); --i)
  23. #define REP(i, n) for(int i=0; i<(n); ++i)
  24. #define RED(i, n) for(int i=(n)-1; i>=0; --i)
  25. #define MASK(i) (1LL << (i))
  26. #define BIT(S, i) (((S) >> (i)) & 1)
  27. #define mp make_pair
  28. #define pb push_back
  29. #define fi first
  30. #define se second
  31. #define all(x) x.begin(), x.end()
  32. #define task "icebear"
  33. #define prev ___prev
  34.  
  35. const int MOD = 1e9 + 7;
  36. const int inf = 1e9 + 27092008;
  37. const ll INF = 1e18 + 27092008;
  38. const int N = 5e5 + 5;
  39. int n, f[N][2][3], c[N], prev[2][3];
  40. vector<int> G[N];
  41. int sumOff[N];
  42.  
  43. // f[u][j][k] : min values to set all subtrees of u, j is state of u after having done,
  44. // k is number of children that in important path
  45.  
  46. void dfs(int u, int par) {
  47. sumOff[u] = (c[u] == 0);
  48. for(int v : G[u]) if (v != par) {
  49. dfs(v, u);
  50. sumOff[u] += sumOff[v];
  51. }
  52.  
  53. if (sumOff[u] == 0) return; // useless
  54. REP(k, 3) f[u][c[u] ^ 1][k] = 1; // base string
  55.  
  56. for(int v : G[u]) if (v != par && sumOff[v] > 0) {
  57. REP(j, 2) REP(k, 3) {
  58. prev[j][k] = f[u][j][k];
  59. f[u][j][k] = inf;
  60. }
  61. REP(j, 2) {
  62. // first edge doesn't affect to u, v and answer
  63. minimize(f[u][j][0], prev[j^1][0] + f[v][1][0] + 1); // u -> v -> [u]
  64. minimize(f[u][j][0], prev[j][0] + f[v][0][0] + 3); // u -> v -> [u -> v -> u]
  65.  
  66. minimize(f[u][j][1], prev[j][0] + f[v][1][1]); // v -> u
  67. minimize(f[u][j][1], prev[j^1][0] + f[v][0][1] + 2); // v -> u -> [v -> u]
  68. minimize(f[u][j][1], prev[j^1][1] + f[v][1][0] + 1); // u -> v -> [u]
  69. minimize(f[u][j][1], prev[j][1] + f[v][0][0] + 3); // u -> v -> [u -> v -> u]
  70.  
  71. minimize(f[u][j][2], prev[j^1][0] + f[v][1][2] + 3); // v -> u -> [v -> u -> v]
  72. minimize(f[u][j][2], prev[j][0] + f[v][0][2] + 1); // v -> u -> [v]
  73. minimize(f[u][j][2], prev[j][1] + f[v][1][1]); // u -> v
  74. minimize(f[u][j][2], prev[j^1][1] + f[v][0][1] + 2); // u -> v -> [u -> v]
  75. minimize(f[u][j][2], prev[j^1][2] + f[v][1][0] + 1); // u -> v -> [u]
  76. minimize(f[u][j][2], prev[j][2] + f[v][0][0] + 3); // u -> v -> [u -> v -> u]
  77. }
  78.  
  79. REP(j, 2) {
  80. minimize(f[u][j][1], f[u][j][0]);
  81. minimize(f[u][j][2], f[u][j][1]);
  82. }
  83. }
  84. }
  85.  
  86. void init(void) {
  87. cin >> n;
  88. FOR(i, 1, n) {
  89. char x; cin >> x;
  90. c[i] = (x == '1');
  91. }
  92. FOR(i, 2, n) {
  93. int u, v;
  94. cin >> u >> v;
  95. G[u].pb(v);
  96. G[v].pb(u);
  97. }
  98. }
  99.  
  100. void process(void) {
  101. memset(f, 0x3f, sizeof f);
  102. FOR(i, 1, n) if (c[i] == 0) {
  103. dfs(i, -1);
  104. cout << f[i][1][2] << '\n';
  105. break;
  106. }
  107. }
  108.  
  109. int main() {
  110. ios_base::sync_with_stdio(0);
  111. cin.tie(0); cout.tie(0);
  112. if (fopen(task".inp", "r")) {
  113. freopen(task".inp", "r", stdin);
  114. freopen(task".out", "w", stdout);
  115. }
  116. int tc = 1;
  117. // cin >> tc;
  118. while(tc--) {
  119. init();
  120. process();
  121. }
  122. return 0;
  123. }
  124.  
Success #stdin #stdout 0.01s 29464KB
stdin
Standard input is empty
stdout
Standard output is empty