제출 #441197

#제출 시각아이디문제언어결과실행 시간메모리
441197peijarPower Plant (JOI20_power)C++17
100 / 100
211 ms25412 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int MAXN = 2e5;

vector<int> adj[MAXN];
bitset<MAXN> hasPower;
int dp[MAXN][2]; // DP[curNode][onBefore]

int nbSommets;

void dfs(int u, int p) {
  for (int v : adj[u])
    if (v != p)
      dfs(v, u);

  // Put power :
  if (hasPower[u]) {
    dp[u][0] = 1;
    for (int v : adj[u])
      if (v != p)
        dp[u][0] = max(dp[u][0], 1 + dp[v][1]);
    dp[u][1] = 1;
  }
  // Don't put power :
  // Put power in only one place :
  for (int v : adj[u])
    if (v != p) {
      for (int b = 0; b < 2; ++b)
        dp[u][b] = max(dp[u][b], dp[v][b] - (b and hasPower[u]));
    }
  // Or put power in multiple places :
  int tot = 0;
  for (int v : adj[u])
    if (v != p)
      tot += dp[v][1];
  dp[u][0] = max(dp[u][0], tot - hasPower[u]);
  dp[u][1] = max(dp[u][1], tot - hasPower[u]);
}

signed main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(0);

  cin >> nbSommets;
  for (int i = 1; i < nbSommets; ++i) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 0; i < nbSommets; ++i) {
    char c;
    cin >> c;
    hasPower[i] = c == '1';
  }

  dfs(0, 0);
  cout << dp[0][0] << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...