Submission #1284658

#TimeUsernameProblemLanguageResultExecution timeMemory
1284658LucaLucaMFriend (IOI14_friend)C++20
100 / 100
32 ms10900 KiB
#include "friend.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>

#define debug(x) #x << " = " << x << '\n'
using ll = long long;

// Find out best sample
int findSample(int n, int a[], int parent[], int type[]){
  std::vector<std::vector<int>> g(n);

  for (int i = 1; i < n; i++) {
    g[parent[i]].push_back(i);
  }

  std::vector<std::vector<int>> dp(n, std::vector<int>(2, 0));

  auto dfs = [&](auto &&self, int u) -> void {
    dp[u][0] = 0;
    dp[u][1] = a[u];
      
    std::reverse(g[u].begin(), g[u].end());
    
    for (int v : g[u]) {
      self(self, v);
      int old0 = dp[u][0];
      int old1 = dp[u][1];
      if (type[v] == 0) {
        dp[u][0] += std::max(dp[v][0], dp[v][1]);
        dp[u][1] += dp[v][0];
      } else if (type[v] == 1) {
        dp[u][0] += dp[v][0];
        dp[u][1] = std::max({old1 + dp[v][1], old1 + dp[v][0], old0 + dp[v][1]});
      } else {
        dp[u][0] += dp[v][0];
        dp[u][1] = std::max(old1 + dp[v][0], old0 + dp[v][1]);
      }
    }
  };

  dfs(dfs, 0);
  return std::max(dp[0][0], dp[0][1]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...