Advertisement
pb_jiang

LC968 WA

Jan 24th, 2023
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. /**
  2.  * Definition for a binary tree node.
  3.  * struct TreeNode {
  4.  *     int val;
  5.  *     TreeNode *left;
  6.  *     TreeNode *right;
  7.  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8.  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9.  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10.  * };
  11.  */
  12. class Solution {
  13.     using pii = pair<int, int>;
  14.     using a3 = array<int, 3>;
  15.     pii dfs(TreeNode* node) {
  16.         // cost of subtree covered exculte itself,
  17.         // cost of subtree covered all
  18.         pii ret = {0, 1};
  19.         auto child = vector<TreeNode*>{node->left, node->right};
  20.         for (auto v: child) {
  21.             auto [x, y] = dfs(v);
  22.  
  23.         }
  24.         return ret;
  25.     }
  26.     pii dfs1(TreeNode* node) {
  27.         // cover by itself, cover by its child
  28.         pii ret = {1, INT_MAX / 2};
  29.         int min_delta = INT_MAX / 2;
  30.         int child_cost = 0;
  31.         auto child = vector<TreeNode*>{node->left, node->right};
  32.         for (auto v: child) {
  33.             if (v == nullptr) continue;
  34.             auto [self_cover, child_cover] = dfs1(v);
  35.             child_cost += min(self_cover, child_cover);
  36.             min_delta = min(min_delta, child_cover - self_cover);
  37.         }
  38.         ret.first += child_cost;
  39.         ret.second += child_cost + (min_delta < 0 ? 0 : min_delta);
  40.         return ret;
  41.     }
  42.     a3 dfs2(TreeNode* node) {
  43.         a3 ret = {0, INT_MAX / 2, 1};
  44.         auto child = vector<TreeNode*>{node->left, node->right};
  45.         int min_delta = INT_MAX / 2;
  46.         for (auto v: child) {
  47.             if (v == nullptr) continue;
  48.             auto [subtree, cover_noplace, cover_place] = dfs2(v);
  49.             ret[2] += min({subtree, cover_noplace, cover_place});
  50.             ret[1] += min(cover_noplace, cover_place);
  51.             min_delta = min(min_delta, cover_place - cover_noplace);
  52.             ret[0] += cover_noplace;
  53.         }
  54.         if (min_delta > 0) ret[1] += min_delta;
  55.         return ret;
  56.     }
  57. public:
  58.     int minCameraCover(TreeNode* root) {
  59.         auto ans = dfs2(root);
  60.         return min(ans[1], ans[2]);
  61.     }
  62. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement