제출 #1363445

#제출 시각아이디문제언어결과실행 시간메모리
1363445TraianDanciuStar Trek (CEOI20_startrek)C++20
0 / 100
1 ms344 KiB
#include <iostream>
#include <vector>

using namespace std;

const int MAXN = 100000;
const int MOD = 1000000007;

vector<int> g[MAXN + 1];
int n, sz[MAXN + 1], down[MAXN + 1], down_move[MAXN + 1];
int cnt, can_win[MAXN + 1], win_move[MAXN + 1];
long long dp[MAXN + 1];

void dfs(int node, int parent) {
  sz[node] = 1;
  for(int son : g[node]) {
    if(son != parent) {
      dfs(son, node);
      sz[node] += sz[son];
      if(down[son] == 0) {
        down[node]++;
        down_move[node] = son;
      }
    }
  }
}

void dfs2(int node, int parent) {
  can_win[node] = down[node];
  win_move[node] = down_move[node];
  if(node > 1 && can_win[parent] > 0 && (can_win[parent] > 1 || win_move[parent] != node)) {
    can_win[node]++;
    win_move[node] = parent;
  }
  if(can_win[node] > 0) {
    cnt++;
  }
  for(int son : g[node]) {
    if(son != parent) {
      dfs2(son, node);
    }
  }
}

void dfs3(int node, int parent) {
  long long sum = 0;
  for(int son : g[node]) {
    if(son != parent) {
      dfs3(son, node);
      sum += dp[son];
    }
  }
  if(down[node] >= 2) {
    dp[node] = 1LL * n * sz[node];
  } else if(down[node] == 1) {
    dp[node] = 1LL * n * sz[node] - dp[down_move[node]];
  } else {
    dp[node] = 1LL * n * sz[node] - cnt - sum;
  }
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  long long d;
  cin >> n >> d;
  for(int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }

  dfs(1, 0);
  dfs2(1, 0);
  dfs3(1, 0);
  
  cout << dp[1] << "\n";
  return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…